Codificación vine para comprobar el rendimiento vararg de Java.rendimiento varargs de Java
escribo siguiente código de prueba:
public class T {
public static void main(String[] args) {
int n = 100000000;
String s1 = new String("");
String s2 = new String("");
String s3 = new String("");
String s4 = new String("");
String s5 = new String("");
long t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
foo();
}
System.err.println(System.currentTimeMillis() - t);
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
baz(s1, s2, s3, s4, s5);
}
System.err.println(System.currentTimeMillis() - t);
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
bar(s1, s2, s3, s4, s5);
}
System.err.println(System.currentTimeMillis() - t);
}
static void foo() {
}
static void bar(String a1, String a2, String a3, String a4, String a5) {
}
static void baz(String... a) {
}
}
En mi máquina la producción media es:
78
4696
78
Parece que las variables de paso a métodos es sin costo?! Bueno !
¡Pero usar varags es 60 veces más lento! Por qué ?
Una explicación podría ser que el programa debe crear la matriz en el montón y el tiempo es gastado por GC. Pero por menos bucles sigo teniendo como salida:
0
62
0
Lo que está pasando este tiempo extra de todos modos y el compilador tiene toda la información para resolver este a una llamada variable de corrección ...
No es mi intención para optimizar para eso, pero he encontrado este curioso ...
actualización
he añadido una nueva prueba
t = System.currentTimeMillis();
for (int i = 0; i < n; i++) {
baz(s1);
}
System.err.println(System.currentTimeMillis() - t);
Y esta versión de un argumento todavía es 30 veces más lenta. Tal vez hay una ArrayList.toArray() detrás de la escena?
Por lo tanto, tenga en cuenta los métodos de varags innecesarios en su código y refactor para fijar la longitud. Eso podría ser un impulso de rendimiento.
Sí, será lo mismo, ya que los varargs son azúcar sintáctico transformado en llamadas de matriz antes de la compilación efectiva. – Riduidel
Esto es básicamente correcto, aunque creo que debe aclarar que la diferencia es que varargs requiere que la JVM asigne y complete una matriz. Ya sea en el montón o pila no es el problema (aunque sí, por supuesto, está en el montón). –
@Sean Owen Gracias, actualizado. –