Fastest way to set all values of an array?

后端 未结 14 2303
悲哀的现实
悲哀的现实 2020-12-04 17:47

I have a char [], and I want to set the value of every index to the same char value.
There is the obvious way to do it (iteration):

<         


        
14条回答
  •  佛祖请我去吃肉
    2020-12-04 18:05

    System.arraycopy is my answer. Please let me know is there any better ways. Thx

    private static long[] r1 = new long[64];
    private static long[][] r2 = new long[64][64];
    
    /**Proved:
     * {@link Arrays#fill(long[], long[])} makes r2 has 64 references to r1 - not the answer;
     * {@link Arrays#fill(long[], long)} sometimes slower than deep 2 looping.
    */ private static void testFillPerformance() { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); System.out.println(sdf.format(new Date())); Arrays.fill(r1, 0l); long stamp0 = System.nanoTime(); // Arrays.fill(r2, 0l); -- exception long stamp1 = System.nanoTime(); // System.out.println(String.format("Arrays.fill takes %s nano-seconds.", stamp1 - stamp0)); stamp0 = System.nanoTime(); for (int i = 0; i < 64; i++) { for (int j = 0; j < 64; j++) r2[i][j] = 0l; } stamp1 = System.nanoTime(); System.out.println(String.format("Arrays' 2-looping takes %s nano-seconds.", stamp1 - stamp0)); stamp0 = System.nanoTime(); for (int i = 0; i < 64; i++) { System.arraycopy(r1, 0, r2[i], 0, 64); } stamp1 = System.nanoTime(); System.out.println(String.format("System.arraycopy looping takes %s nano-seconds.", stamp1 - stamp0)); stamp0 = System.nanoTime(); Arrays.fill(r2, r1); stamp1 = System.nanoTime(); System.out.println(String.format("One round Arrays.fill takes %s nano-seconds.", stamp1 - stamp0)); stamp0 = System.nanoTime(); for (int i = 0; i < 64; i++) Arrays.fill(r2[i], 0l); stamp1 = System.nanoTime(); System.out.println(String.format("Two rounds Arrays.fill takes %s nano-seconds.", stamp1 - stamp0)); }

    12:33:18
    Arrays' 2-looping takes 133536 nano-seconds.
    System.arraycopy looping takes 22070 nano-seconds.
    One round Arrays.fill takes 9777 nano-seconds.
    Two rounds Arrays.fill takes 93028 nano-seconds.

    12:33:38
    Arrays' 2-looping takes 133816 nano-seconds.
    System.arraycopy looping takes 22070 nano-seconds.
    One round Arrays.fill takes 17042 nano-seconds.
    Two rounds Arrays.fill takes 95263 nano-seconds.

    12:33:51
    Arrays' 2-looping takes 199187 nano-seconds.
    System.arraycopy looping takes 44140 nano-seconds.
    One round Arrays.fill takes 19555 nano-seconds.
    Two rounds Arrays.fill takes 449219 nano-seconds.

    12:34:16
    Arrays' 2-looping takes 199467 nano-seconds.
    System.arraycopy looping takes 42464 nano-seconds.
    One round Arrays.fill takes 17600 nano-seconds.
    Two rounds Arrays.fill takes 170971 nano-seconds.

    12:34:26
    Arrays' 2-looping takes 198907 nano-seconds.
    System.arraycopy looping takes 24584 nano-seconds.
    One round Arrays.fill takes 10616 nano-seconds.
    Two rounds Arrays.fill takes 94426 nano-seconds.

提交回复
热议问题