Java's varargs performance

前端 未结 5 551
北荒
北荒 2020-12-03 21:18

Coding i came around to check for the vararg performance of Java.

I write following test code:

public class T {

    public static void main(String[         


        
5条回答
  •  醉酒成梦
    2020-12-03 22:13

    I refactored some of the code. I use int now instead of String cause strings end in a pool and are immutable, and I don't know how that influences the compiler optimizations.

    Also I recreate the values so they won't be constants which might also influence compiler optimizations.

    And I do something with the methods, also against compiler optimizations.

    public class Test {
    
    
        static int n = 100_000_000;
        static int[] all_string = new int[n*1*5];
        static int all_strings_index = 0;
    
    
    
        public static void main(String[] args) {
    
            while(true) {
        
                all_strings_index = 0;
        
                int s1 = (int) System.nanoTime();
                int s2 = (int) System.nanoTime();
                int s3 = (int) System.nanoTime();
                int s4 = (int) System.nanoTime();
                int s5 = (int) System.nanoTime();
        
                long t = System.currentTimeMillis();
        
        
                t = System.currentTimeMillis();
                for (int i = 0; i < n; i++) {
                    var(s1, s2, s3, s4, s5);
                }
                System.err.println("varargs    "+(System.currentTimeMillis() - t));
        
                all_strings_index = 0;
        
                t = System.currentTimeMillis();
                for (int i = 0; i < n; i++) {
                    par(s1, s2, s3, s4, s5);
                }
                System.err.println("parameters "+(System.currentTimeMillis() - t));
        
        
                all_strings_index = 0;
        
                int[] arr = new int[] {s1, s2, s3, s4, s5};
        
                t = System.currentTimeMillis();
                for (int i = 0; i < n; i++) {
                    var2(arr);
                }
                System.err.println("array      "+(System.currentTimeMillis() - t));
                System.err.println();
        
            }
    
        }
    
        static void par(int a1, int a2, int a3, int a4, int a5) {
            all_string[all_strings_index++] = a1;
            all_string[all_strings_index++] = a2;
            all_string[all_strings_index++] = a3;
            all_string[all_strings_index++] = a4;
            all_string[all_strings_index++] = a5;
        }
    
        static void var(int... a) {
            for (int s : a) {
                all_string[all_strings_index++] = s;
            }
        }
    
        static void var2(int[] a) {
            for (int s : a) {
                all_string[all_strings_index++] = s;
            }
        }
    }
    
    varargs    981
    parameters 415
    array      687
    
    varargs    962
    parameters 434
    array      411
    
    varargs    975
    parameters 469
    array      439
    
    varargs    983
    parameters 462
    array      447
    
    varargs    999
    parameters 470
    array      439
    
    varargs    1018
    parameters 475
    array      455
    
    varargs    1014
    parameters 467
    array      440
    

    varargs are a lot slower.

提交回复
热议问题