1

私は Java/Android プログラミングにやや慣れていないので、呼び出しているメソッドの経過時間を計算するための簡単な時間測定を試みています。

現在、私のコードは次のようになっています。

        startTime = System.currentTimeMillis();
        java_doubleinterp(args, ans);
        endTime = System.currentTimeMillis();
        elapsed = endTime - startTime;
        setTextview(ans);

メソッドjava_doubleinterpには for ループが含まれており、これは純粋に数学的なものであり、適切に機能しています。入力はargsで、出力はansです。これのパフォーマンスを、MatLab で自動的に生成され、この構造を持つ C/C++ (NDK) を使用して実装された同様の関数と比較しようとしているため、何も返しません。

C/C++ 関数について、同じ方法で時間を測定しようとすると、同じエラーが発生します。

コードの後半で私はこれを持っています:

Toast elapsedTime = Toast.makeText(getApplicationContext(), 
            "Elapsed time for " + lang + " code: \n" + (elapsed*1000)+ "\u03BCs", 
            Toast.LENGTH_LONG);

lang は単なる文字列です。

このトーストは、経過時間が 0us (マイクロ秒) であることを返しています。

この問題をデバッグしようとしたときに startTime と endTime を表示しましたが、どちらも同じ値を示しています。なぜこうなった?


Obs: nanoTime() を使用して時間を取得し、精度を高めようとしましたが、結果は次のとおりです。

  • エミュレータ:約50us
  • 電話 (Nexus 4) : 0us または 30us [意味がありません]

編集:

コードにいくつかの変更を加えたところ、Java メソッドは次のようになりました。

startTime = System.nanoTime();
java_doubleinterp(args, ans);
setTextview(ans);
endTime = System.nanoTime();
elapsed = endTime - startTime;

これは c 関数 (JNI) の部分です。

startTime = System.nanoTime();
doubleinterp(args, ans);
setTextview(ans);
endTime = System.nanoTime();
elapsed = endTime - startTime;

彼らは今、うまくいっています。setTextview はコードの 2 つの部分で同じメソッドであるため、絶対実行時間は間違っている可能性がありますが、(Java 実装と JNI 実装の間の) 相対実行時間は問題ありません。

今、私はより意味のある平均実行時間を取得しています:

  • エミュレーター: 3.75 ミリ秒 (Java) / 6.59 ミリ秒 (JNI)
  • Nexus 4: 1.11ms (Java) / 0.82ms (JNI)
4

3 に答える 3

2

ダミー ルーチンのパフォーマンスを測定しようとしています。おそらく、コンパイラは単純にすべてをなくしているので、0 マイクロ秒を取得しているのはそのためです。

于 2013-05-23T22:40:23.603 に答える
0

変数 startTime と endTime が Long であることを確認してください

于 2013-05-23T22:53:56.130 に答える
0

開始時刻と終了時刻の差が 0 になるように、ルーチンが非常に高速に終了しているようです。パフォーマンスを測定すると、私の知る限り、nanoTime() は currentTimeMillis() よりもはるかに優れています。入力のサイズを大きくしてみてください

于 2013-05-24T04:36:43.557 に答える