これは興味深い質問で、@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以降、格差が大幅に解消されています。また、静的かどうかにかかわらず、空のメソッドを呼び出すためのコストはまだあります。
しかし、時間のヒストグラムを見ると、面白いことが分かります。大部分の呼び出しは、静的であるかどうかにかかわらず、30〜40nsを要し、データを正確に見ると、それらは事実上すべて30nsです。 (メソッド呼び出しをコメントアウト)空のループで同じコードを実行
余りが正確30nsのであるがしかし、測定時間の約3/4が0nsであり、8nsの平均速度を生成します。
このデータをどのように説明するのかはわかりませんが、@ misiu_mpの結論はまだ成立していません。空の静的メソッドと非静的メソッドの違いはごくわずかであり、測定の優位性は正確に30nsです。つまり、空のメソッドを実行するにはまだゼロ以外のコストがあるように見えます。
ええコメントを外してしまえば、それは本当にあなたを噛む文字列ビルダです。その理由は、ランタイムjitまたはaotコンパイラは、文字列の作成が失敗してプログラムのフローに影響を与える場合、事前に決定できないためです。 周囲が乱雑です。プリコンパイラは正しい方法ですが、今はアンドロイドのデフォルトツールで簡単に行うことはできません。 –