1. 程式人生 > >Java 4種陣列複製方式的效能比較

Java 4種陣列複製方式的效能比較

package com.demo.main;

import java.util.Arrays;

/**
 * <ol>複製陣列的4種方法
 * <li>for</li>
 * <li>clone</li>
 * <li>Arrays.copyOf(original, newLength)</li>
 * <li>System.arraycopy(src, srcPos, dest, destPos, length)</li>
 * </ol>
 */
public class ArrayCopyDemo
{
private static final byte[] buffer = new byte[1024*10]; static { for (int i = 0; i < buffer.length; i++) { buffer[i] = (byte) (i & 0xFF); } } private static long startTime; public static void main(String[] args) { startTime = System.nanoTime(); methodFor(); calcTime("methodFor"
); startTime = System.nanoTime(); methodClone(); calcTime("methodClone"); startTime = System.nanoTime(); methodArraysCopyOf(); calcTime("methodArraysCopyOf"); startTime = System.nanoTime(); methodSystemArraycopy(); calcTime("methodSystemArraycopy"
); } private static void methodFor() { byte[] newBuffer = new byte[buffer.length]; for(int i=0;i<buffer.length;i++) { newBuffer[i] = buffer[i]; } } private static void methodClone() { byte[] newBuffer = buffer.clone(); } private static void methodArraysCopyOf() { byte[] newBuffer = Arrays.copyOf(buffer, buffer.length); } private static void methodSystemArraycopy() { byte[] newBuffer = new byte[buffer.length]; System.arraycopy(buffer, 0, newBuffer, 0, buffer.length); } private static void calcTime(String method) { long endTime = System.nanoTime(); System.out.println(method + " cost " +(endTime-startTime)+ " nanosecond"); } }

這裡寫圖片描述

總結:
(1)從速度上看:System.arraycopy > clone > Arrays.copyOf > for
(2)for的速度之所以最慢是因為下標表示法每次都從起點開始尋位到指定下標處(現代編譯器應該對其有進行優化,改為指標),另外就是它每一次迴圈都要判斷一次是否達到陣列最大長度和進行一次額外的記錄下標值的加法運算。
(3)檢視Arrays.copyOf的原始碼可以發現,它其實本質上是呼叫了System.arraycopy。之所以時間差距比較大,是因為很大一部分開銷全花在了Math.min函式上了。

public static byte[] copyOf(byte[] original, int newLength) {
    byte[] copy = new byte[newLength];
    System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
    return copy;
}

(4)檢視System.arraycopy的原始碼,可以發現它實質上是通過Jni呼叫本地方法,及c/c++已經編譯成機器碼的方法,所以快。

 public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

(5)clone的原始碼不詳,鄙人無法比較,有知道的希望不吝賜教。

相關推薦

Java 4陣列複製方式效能比較

package com.demo.main; import java.util.Arrays; /** * <ol>複製陣列的4種方法 * <li>for</li> * <li>clone</li&

Java中System.arraycopy, Object.clone, Arrays.copyOf和for 4陣列複製方式效能比較

用程式碼說話 package InterviewDirectory.binaryTree_example.System.arraycopy_Arrays; import java.util.Arrays; /** * Created by xxx on

Java 5字串拼接方式效能比較

最近寫一個東東,可能會考慮到字串拼接,想了幾種方法,但對效能未知,於是用Junit寫了個單元測試。 程式碼如下: import java.util.ArrayList; import java.util.List; import org.apache.commons.la

Java 5字串拼接方式效能比較

總結:字串優化 由於String物件時不可變物件,因此在需要對字串進行修改操作時(如字串連線和替換),String物件總是會生成新的物件,所以其效能相對較差。 String常量的累加操作:對於靜態字串的連線操作,Java在編譯時會進行徹底的優化,將多個連線操作的字串

Java筆記】IO流中四檔案複製方式效率比較

位元組流檔案複製方式: (1)位元組流讀寫單個位元組 (2)位元組流讀寫位元組陣列 (3)位元組緩衝流讀寫單個位元組 (4)位元組緩衝流讀寫位元組陣列 import java.io.BufferedInputStream; import java.io.BufferedOutpu

java字串拼接方式效能分析

前幾天寫一個防重複提交的元件的時候,有一個操作是需要將各個欄位的字串拼接成一個requestKey。看了別人的程式碼,我發現,中介軟體這種東西,每天都要處理幾百幾千萬的請求,但是裡面很多字串拼接的時候還是很原始的“+”號拼接,如果將所有的字串拼接操作都換成更高效

坑【4陣列和List效能比較

public class Test { private static int count = 200000000; public static void main(String[]

java指定編碼的按行讀寫txt檔案(幾讀寫方式比較

輸入輸出的幾種形式 1.FileReader,FileWriter File r = new File("temp.txt") FileReader f = new FileReader(name);//讀取檔案name BufferedReader b = new Buf

JAVA中四操作xml方式比較

. 介紹 1)DOM(JAXP Crimson解析器) DOM是用與平臺和語 言無關的方式表示XML文件的官方W3C標準。DOM是以層次結構組織的節點或資訊片斷的集合。這個層次結構允許開發人員在樹中尋找 特定資訊。分析該結構通常需要載入整個文件和構造層次結構,然後才能做任何工作。由於它是基於資訊層次

java 4方式讀取配置檔案 + 修改配置檔案

方式一:採用ServletContext讀取,讀取配置檔案的realpath,然後通過檔案流讀取出來。 因為是用ServletContext讀取檔案路徑,所以配置檔案可以放入在web-info的classes目錄中,也可以在應用層級及web-info的目錄中。檔案存放位置具

php陣列賦值方式效能比較

實現功能:給長度為 1000w 的陣列賦值(鍵值為數字索引值 +1) php版本:5.6.32 賦值方式: arr[ ] array_push( ) 程式碼: <?php ini_set

OC陣列 NSArray的4遍歷方式

前言:NSArray對應的是java的List,不同的是其元素不能更改,不過其派生類NSMutableArray可以更改,遍歷的方式跟java的List基本一樣 一.  for迴圈 Student *stu = [Student student]; NSArray *a

jQuery中ajax的4常用請求方式

ger loaded resource media val als images 詳細 有一個 jQuery中ajax的4種常用請求方式: 1.$.ajax()返回其創建的 XMLHttpRequest 對象。 $.ajax() 只有一個參數:參數 key/va

PHP 4輸出的方式

dump 三種 inf 一個 info keyword eset func 測試 <?php //測試用的數組 $info = array(‘11‘=>‘aaa‘, ‘22‘=>‘bbb‘, ‘33‘=>‘ccc‘); //第一種,將整個

js數組的4遍歷方式

參數 形參 javascrip HA each log i++ 定義 har 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"/&g

java 4修飾符

都是 修飾符 創建 java default ava 訪問權限 權限 fault      訪問權限 類 包 子類 其他包      public ∨ ∨ ∨ ∨ (對任何人都是可用的)      pro

Java 之 檔案讀寫及效能比較總結

Java 之 檔案讀寫及效能比較總結 2014年05月12日 17:56:49 閱讀數:21765  幹Java這麼久,一直在做WEB相關的專案,一些基礎類差不多都已經忘記。經常想得撿起,但總是因為一些原因,不能如願。 其實不是沒有時間,只是有些時候疲於總結,今得空,下定決心

struts2[2.1]結果處理-4結果處理方式

1.學習路線 接下來咱們一起來學一學struts2的幾種結果處理方式(關於struts2搭建、配置我會在之後慢慢發的),let`s go!             &

WebSocket 框架的效能比較

前一篇文章使用四種框架分別實現百萬websocket常連線的伺服器介紹了四種websocket框架的測試方法和基本資料。 最近我又使用幾個框架實現了websocket push伺服器的原型,並專門對這七種實現做了測試。 本文記錄了測試結果和一些對結果的分析。 這七種框架是: Netty

python dict 兩遍歷方式比較

關於糾結dict遍歷中帶括號與不帶括號的效能問題 1 for (d,x) in dict.items(): 2 print "key:"+d+",value:"+str(x) 3 4 for d,x in dict.items(): 5 print "key:"+d+"