JavaScript和Java数组拷贝各种方法耗时比较

来源:互联网 发布:郑州863软件孵化器 编辑:程序博客网 时间:2024/06/01 13:03

Java数组复制方法耗时比较,先上代码:

import java.util.Arrays;/** * Created by jxr202 on 2017/10/13 */public class ArraysCopyCompare {// 初始化50000个元素的数组static int[] array = new int[50000];    static {        for (int i = 0; i < array.length; i ++) {            array[i] = (int) (10000 * Math.random());        }    }        public static void main(String args[]) {    long time1 = 0, time2 = 0, time3 = 0, time4 = 0;    for (int i = 0; i < 5; i ++) {        time1 += method1();    time2 += method2();    time3 += method3();    time4 += method4();    }    System.out.println("time1: " + time1 + ", time2: " + time2 + ", time3: " + time3 + ", time4: " + time4);    }    // 使用For循环复制数组,效率太低    static long method1() {    long time = System.currentTimeMillis();    int[] arrayTemp = new int[array.length];    for (int i = 0; i < array.length; i ++) {    arrayTemp[i] = array[i];    }    userArray(arrayTemp);    long time2 = System.currentTimeMillis();    System.out.println("method1 lost time: " + (time2 - time));    return time2 - time;    }    // 使用System.arraycopy()方法,可以看到他为native方法,性能优越    static long method2() {    long time = System.currentTimeMillis();    int[] arrayTemp = new int[array.length];    System.arraycopy(array, 0, arrayTemp, 0, array.length);    userArray(arrayTemp);    long time2 = System.currentTimeMillis();    System.out.println("method2 lost time: " + (time2 - time));    return time2 - time;    }        // 使用Arrays.copyOf方法,其内部使用的是System.arraycopy(),效果和上面的差不多    static long method3() {    long time = System.currentTimeMillis();    int[] arrayTemp = Arrays.copyOf(array, array.length);    userArray(arrayTemp);    long time2 = System.currentTimeMillis();    System.out.println("method3 lost time: " + (time2 - time));    return time2 - time;    }        // 使用Object.clone()方法,看起来需要强转转换,但实际上性能是最优的。    static long method4() {    long time = System.currentTimeMillis();    int[] arrayTemp = array.clone();    userArray(arrayTemp);    long time2 = System.currentTimeMillis();    System.out.println("method4 lost time: " + (time2 - time));    return time2 - time;    }        // 经研究发现,如果数组没有使用它,其复制速度简直超出想象,四个方法全是毫秒级别,只有在使用时才看能出效果    static void userArray(int[] array) {    StringBuilder sb = new StringBuilder();    for (int value : array) {    sb.append(value + ", ");    }    }    }


Eclipse运行结果:

method1 lost time: 25method2 lost time: 9method3 lost time: 8method4 lost time: 8method1 lost time: 8method2 lost time: 8method3 lost time: 6method4 lost time: 4method1 lost time: 7method2 lost time: 4method3 lost time: 6method4 lost time: 5method1 lost time: 6method2 lost time: 3method3 lost time: 4method4 lost time: 4method1 lost time: 4method2 lost time: 4method3 lost time: 4method4 lost time: 3time1: 50, time2: 28, time3: 28, time4: 24



经研究发现:

0. 数组在复制后如果没有使用它,其耗时简直是毫秒级别,50000级别的数据,for耗时6毫秒,其他三个耗时1毫秒。故这里在比较时每个方法都使用了一次复制后的数组。

1. For循环方法,性能太慢,在遍历时消耗太多的时间,不推荐该方法。

2. System.arraycopy,该方法为native方法,原生太,性能优越,建议使用。

3. Arrays.copyOf,该方法内部使用的是System.arraycopy,和上面的方法差不多耗时,如果不想写太多的参数,建议使用该方法。

4. Object.clone,该方法另辟蹊径,快速而优越,在遍历它时甚至比原生的native方法还快速,非常推荐使用。



JavaScrpt数组复制方法耗时比较,先上代码:

(function () {    // 初始化50000个元素的数组    let array = [];    for (let i = 0; i < 50000; i ++) {        array.push(parseInt(10000 * Math.random()));    }    method1();    method2();    method3();    // 使用For循环复制数组,效率太低    function method1() {        let arrayTemp = [];        let time = new Date().getTime();        for (let i = 0; i < array.length; i ++) {            arrayTemp[i] = array[i];        }        userArray(arrayTemp);        let time2 = new Date().getTime();        console.log("For lost time: " + (time2 - time));    }    // 使用slice复制数组,性能优越,建议使用    function method2() {        let time = new Date().getTime();        let arrayTemp = array.slice();        userArray(arrayTemp);        let time2 = new Date().getTime();        console.log("Slice lost time: " + (time2 - time));    }    // 使用concat复制数组,性能极佳,推荐使用    function method3() {        let time = new Date().getTime();        let arrayTemp = array.concat();        userArray(arrayTemp);        let time2 = new Date().getTime();        console.log("Concat lost time: " + (time2 - time));    }    // 经研究发现,如果数组没有使用它,其复制速度简直超出想象,三个方法全是0-1毫秒,只有在使用时才看能出效果    function userArray(array) {        let sb = "";        for (let value of array) {            sb += value + ", "        }    }})();

WebStorm运行结果:

For lost time: 14Slice lost time: 9Concat lost time: 3




经研究发现:

0. 数组在复制后如果没有使用它,50000级别的数据,for耗时1毫秒,其他二个耗时0毫秒。故这里在比较时每个方法都使用了一次复制后的数组。

1. For循环方法,性能太慢,在遍历时消耗太多的时间,不推荐该方法。

2. Slice,该方法为仅耗时9个毫秒,性能优越,建议使用。

3. Concat,该方法仅耗时3个毫秒,性能极速,非常推荐使用。

4. JavaScript中数组没有clone方法,使用该方法会报错。




原创粉丝点击