System.arraycopy比手工的for復(fù)制速度慢?

字號(hào):

現(xiàn)在用的是 jdk6u7 。在小數(shù)據(jù)量的情況下,還是手工 for 比較快。但是當(dāng)數(shù)組大約超過(guò) 20 項(xiàng)的時(shí)候,System.arraycopy()就比較快一些了。當(dāng)數(shù)組長(zhǎng)度上百以后,System.arraycopy()的優(yōu)勢(shì)相當(dāng)明顯。此時(shí)clone()方法的速度也相當(dāng)顯眼。
    如果使用 -server 模式,性能又大約有近一倍的提升?,F(xiàn)在大家的機(jī)器的內(nèi)存都大了。用java平臺(tái)工具的時(shí)候,大概都可以加上 -server 。
    java version "1.6.0_07"
    Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
    Java HotSpot(TM) Client VM (build 10.0-b23, mixed mode, sharing)
    Examda提示:以下是測(cè)試結(jié)果和源代碼。結(jié)果中的數(shù)字的單位是毫秒。
    --------------------------------------------------------------------------------
    prompt>java ArrayCopyTest
    short array ############
    arrayClone 1328
    arrayManulCopy 266
    arraySysCopy 359
    long array ########################
    arrayClone 1359
    arrayManulCopy 469
    arraySysCopy 406
    big array ####################################
    arrayClone 1735
    arrayManulCopy 2015
    arraySysCopy 985
    huge array ################################################
    arrayClone 4281
    arrayManulCopy 9500
    arraySysCopy 3453
    mass array ############################################################
    arrayClone 7375
    arrayManulCopy 19297
    arraySysCopy 6578
    prompt>java -server ArrayCopyTest
    short array ############
    arrayClone 359
    arrayManulCopy 234
    arraySysCopy 203
    long array ########################
    arrayClone 219
    arrayManulCopy 266
    arraySysCopy 203
    big array ####################################
    arrayClone 391
    arrayManulCopy 859
    arraySysCopy 391
    huge array ################################################
    arrayClone 1828
    arrayManulCopy 4250
    arraySysCopy 1875
    mass array ############################################################
    arrayClone 3812
    arrayManulCopy 8625
    arraySysCopy 3844
    import java.util.Date;
    import java.util.Random;
    public class ArrayCopyTest {
    public static void main(String[] args) {
    new ArrayCopyTest().arrayCopy();
    }
    Object[] srcArray1 = { "sdfsdaf", new Date(), new Integer(200) };
    Object[] srcArray2 =
    { "qwerasd", new Date(), new Integer(190), srcArray1, new Object(),
    new String[] { "aaa", "bbb" } };
    Object[] srcArray3 = new Object[30];
    Object[] srcArray4 = new Object[150];
    Object[] srcArray5 = new Object[300];
    ArrayCopyTest() {
    fillArray(srcArray3);
    fillArray(srcArray4);
    fillArray(srcArray5);
    }
    /**
    * 填充對(duì)象數(shù)組。
    * @param objs 填充目標(biāo)。
    * private void fillArray(Object[] objs) {
    for (int i = 0; i < objs.length; i = i + 10) {
    fillArray(objs, i);
    }
    }
    void fillArray(Object[] objs, int start) {
    objs[start++] = new Object();
    objs[start++] = new Date();
    objs[start++] = getRandomString();
    objs[start++] = getRandomString();
    objs[start++] = getRandomString();
    objs[start++] = getRandomString();
    objs[start++] = getRandomString();
    objs[start++] = r.nextLong();
    objs[start++] = getRandomString();
    objs[start++] = getRandomString();
    }
    private Random r = new Random();
    /**
    *獲取隨機(jī)字符串。
    * @return 隨機(jī)字符串
    */
    String getRandomString() {
    StringBuffer sb = new StringBuffer();
    int loop = 3 + r.nextInt(4);
    while (loop > 0) {
    loop--;
    sb.append((char)(97 + r.nextInt(25)));
    sb.append((char)(65 + r.nextInt(25)));
    }
    return sb.toString();
    }
    void arrayCopy() {
    testMethod("short array\t############", srcArray1);
    testMethod("long array\t########################", srcArray2);
    testMethod("big array\t####################################",
    srcArray3);
    testMethod("huge array\t################################################",
    srcArray4);
    testMethod("mass array\t############################################################",
    srcArray5);
    }
    /**
    *成組測(cè)試。
    * @param prmpt 測(cè)試提示
    * @param args 測(cè)試對(duì)象數(shù)組
    */
    void testMethod(String prmpt, Object[] args) {
    int loop = 5000000;
    System.out.println(prmpt);
    arrayClone(loop, args);
    arrayManualCopy(loop, args);
    arraySysCopy(loop, args);
    }
    void arrayClone(int loop, Object[] sourceArray) {
    long time = System.currentTimeMillis();
    for (int i = 0; i < loop; ++i) {
    Object[] destArray = (Object[])sourceArray.clone();
    }
    System.out.println(" arrayClone\t" +
    (System.currentTimeMillis() - time));
    }
    void arraySysCopy(int loop, Object[] sourceArray) {
    long time = System.currentTimeMillis();
    for (int i = 0; i < loop; ++i) {
    Object[] destArray = new Object[sourceArray.length];
    System.arraycopy(sourceArray, 0, destArray, 0, sourceArray.length);
    }
    System.out.println(" arraySysCopy\t" +
    (System.currentTimeMillis() - time));
    }
    void arrayManualCopy(int loop, Object[] sourceArray) {
    long time = System.currentTimeMillis();
    for (int i = 0; i < loop; ++i) {
    Object[] destArray = new Object[sourceArray.length];
    for (int j = 0; j < sourceArray.length; ++j) {
    destArray[j] = sourceArray[j];
    }
    }
    System.out.println(" arrayManulCopy\t" +
    (System.currentTimeMillis() - time));
    }
    }