這是一個有趣的問題,我喜歡@misiu_mp分析,所以我想我會在運行Android 6.0.1的Nexus 7上進行2016測試更新。下面是測試代碼:
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() { }
的sleep()
加入到防止溢出Log.d
緩衝器。
我發揮它周圍很多次,結果與@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
靜態方法調用總是比非靜態方法調用稍微快一點,但它會出現一個)自Android 2.3.2以來,差距已經明顯縮小,並且b)調用靜態或空閒方法仍有成本。
然而,看時間直方圖會發現一些有趣的事情。絕大多數呼叫,無論是否靜止,都需要30-40ns,並且仔細查看數據,它們實際上完全是30ns。
![enter image description here](https://i.stack.imgur.com/1LGmc.png)
運行帶有空環(註釋出方法調用)相同的代碼產生爲8ns的平均速度,但是,關於所測量的時間的3/4是爲0ns,而其餘部分是完全爲30ns。
我不確定如何解釋這些數據,但我不確定@ misiu_mp的結論是否成立。空靜態和非靜態方法之間的差異可以忽略不計,而測量的優勢恰恰是30ns。這就是說,似乎運行空方法仍然存在一些非零成本。
是啊如果你沒有註釋的話,它確實是咬你的stringbuilder。原因是運行時jit或aot編譯器無法提前確定字符串創建是否會失敗,從而影響程序的流程。 一個如果在它周圍是混亂。預編譯器是正確的方式,但現在沒有簡單的方法來做到這一點與Android默認工具,我認爲。 – 2016-04-30 17:13:29