Esta es una pregunta interesante y me gusta el análisis de @misiu_mp, así que pensé que lo actualizaría con una prueba de 2016 en un Nexus 7 con Android 6.0.1. Aquí está el código de prueba:
public void runSpeedTest() {
long startTime;
long[] times = new long[100000];
long[] staticTimes = new long[100000];
for (int i = 0; i < times.length; i++) {
startTime = System.nanoTime();
for (int j = 0; j < 1000; j++) {
emptyMethod();
}
times[i] = (System.nanoTime() - startTime)/1000;
startTime = System.nanoTime();
for (int j = 0; j < 1000; j++) {
emptyStaticMethod();
}
staticTimes[i] = (System.nanoTime() - startTime)/1000;
}
int timesSum = 0;
for (int i = 0; i < times.length; i++) { timesSum += times[i]; Log.d("status", "time," + times[i]); sleep(); }
int timesStaticSum = 0;
for (int i = 0; i < times.length; i++) { timesStaticSum += staticTimes[i]; Log.d("status", "statictime," + staticTimes[i]); sleep(); }
sleep();
Log.d("status", "final speed = " + (timesSum/times.length));
Log.d("status", "final static speed = " + (timesStaticSum/times.length));
}
private void sleep() {
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void emptyMethod() { }
private static void emptyStaticMethod() { }
se añadió el sleep()
para evitar desbordamiento del búfer Log.d
.
He jugado un poco con él muchas veces y los resultados fueron bastante consistentes con @misiu_mp:
10^5 iterations of 1000 calls to an empty static void function: 29ns/call
10^5 iterations of 1000 calls to an empty non-static void function: 34ns/call
La llamada al método estático siempre fue ligeramente más rápido que la llamada al método no estático, pero parecería que una) la brecha se ha cerrado significativamente desde Android 2.3.2 yb) todavía hay un costo para hacer llamadas a un método vacío, estático o no.
Mirar un histograma de veces revela algo interesante, sin embargo. La mayoría de las llamadas, ya sean estáticas o no, toman entre 30 y 40 segundos, y mirando de cerca los datos, son prácticamente todos exactamente 30.
Ejecutar el mismo código con bucles vacías (comentando las llamadas a métodos) produce una velocidad media de 8 ns, sin embargo, aproximadamente 3/4 de los tiempos medidos son 0ns mientras que el resto son exactamente 30 ns.
No estoy seguro de cómo explicar estos datos, pero no estoy seguro de que las conclusiones de @ misiu_mp aún se mantengan. La diferencia entre los métodos estáticos vacíos y no estáticos es insignificante, y la preponderancia de las mediciones es exactamente 30ns. Dicho esto, parece que todavía hay un costo no nulo para ejecutar métodos vacíos.
Sí, realmente es el generador de cuerdas el que te muerde si no tienes comentarios. la razón es que el compilador jit or aot en tiempo de ejecución no puede determinar de antemano si la creación de cadena fallará, lo que afecta el flujo del programa. y si está desordenado. un precompilador sería la manera correcta, pero en este momento no hay una manera fácil de hacerlo con las herramientas predeterminadas de Android, creo. –