Android フォンでフィボナッチ ベンチマークを実行していますが、奇妙な結果が得られます。UI スレッドがロックされているかどうかはあまり気にしないので、アプリケーションの UI スレッド内で以下のコードを実行しています (これはパフォーマンスに影響しますか?)。
public void startBenchmark(View view) {
results = "";
results += String.format("Begin test");
for (int i = 45; i < 46; i++) {
startTime = System.currentTimeMillis();
fib(i);
results += String.format("%d\n", System.currentTimeMillis() - startTime);
}
results += String.format("End test");
Log.d("Results", results);
Log.d("Status", "Finished");
}
private static int fib(int n) {
return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}
また、対応するコードを JavaScript で実装しました。
function performBenchmark() {
for (var i = 45; i < 46; i++) {
benchmark(i)
}
}
function benchmark(n){
var start= Date.now();
document.getElementById("disp").innerHTML += "fib(" + n + "): " + fib(n) + " <br />";
document.getElementById("results").innerHTML += (Date.now() - start) + "<br />";
}
function fib(n) {
return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}
私の問題は、fib(45) の場合、Java を使用したネイティブ プラットフォームで 420 秒、Chrome で Javascript を使用して 120 秒のような時間がかかり、どちらも Samsung Galaxy Nexus で実行されていることです。
Android 用の Java での私の実装に、ベンチマークを遅くしている可能性のある明らかな問題がありますか?
ノート; 私は主に高速なアルゴリズムに切り替えるつもりはありませんが、Javascript (および iOS 用に作成した実装) が Android 用の Java での実装よりもはるかに高速である理由を理解しようとしています。
ラップトップで実行すると、Javascript よりも Java の方がはるかに高速に結果が得られます。