Dies ist eine interessante Frage und ich mag @misiu_mp Analyse, also dachte ich, ich würde es mit einem Test 2016 auf einem Nexus 7 mit Android 6.0.1 aktualisieren. Hier ist der Testcode:
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() { }
Die sleep()
wurde hinzugefügt, um den Log.d
Pufferüberlauf zu verhindern.
spielte ich mit ihm um viele Male und die Ergebnisse waren ziemlich konsistent mit @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
Die statischen Aufruf Methode war immer etwas schneller als die nicht-statische Methode aufrufen, aber es wäre, dass ein erscheinen) Die Lücke hat sich seit Android 2.3.2 deutlich geschlossen und b) es kostet immer noch Aufrufe an eine leere Methode, statisch oder nicht.
Ein Blick auf ein Histogramm von Zeiten offenbart jedoch etwas Interessantes. Die Mehrheit des Anrufs, egal ob statisch oder nicht, benötigt zwischen 30 und 40 ns und schaut genau auf die Daten, die sie praktisch alle 30 ns genau sind.

den gleichen Code mit leeren Schleifen Laufen (Kommentierung der Verfahrensaufrufe) erzeugt eine Durchschnittsgeschwindigkeit von 8 ns, jedoch etwa 3/4 der gemessenen Zeiten 0ns sind, während der Rest ist genau 30ns.
Ich bin mir nicht sicher, wie ich diese Daten erfassen soll, aber ich bin mir nicht sicher, ob die Schlussfolgerungen von @ misiu_mp immer noch gelten. Der Unterschied zwischen leeren statischen und nicht-statischen Methoden ist vernachlässigbar und das Überwiegen von Messungen ist genau 30ns. Davon abgesehen scheint es, dass es noch einige Kosten gibt, die nicht null sind, um leere Methoden auszuführen.
yeah Es ist wirklich der Stringbuilder, der dich beißt, wenn du unkommentiert bist. Der Grund dafür ist, dass der Runtime-JIT- oder AOT-Compiler nicht im Voraus bestimmen kann, ob die String-Erstellung fehlschlägt und sich auf den Programmablauf auswirkt. ein wenn es herum chaotisch ist. Ein Pre-Compiler wäre der richtige Weg, aber momentan gibt es keinen einfachen Weg, dies mit den Androiden-Standardwerkzeugen zu tun, denke ich. –