2010-12-05 5 views
1

アンドロイドアプリケーションでは、指数モジュラス操作を実行しようとしていて、その処理にかかる時間を計算したいと考えています。だから、私は、アプリケーションを実行しているときに、これらの2つのタイムスタンプによって報告された時間の差は、同じ入力の広い範囲にわたって変化しているだけの操作後エミュレータで同じアプリケーションを複数回実行した場合のタイムスタンプの大きな違い

Calendar calendar0 = Calendar.getInstance(); 
java.util.Date now0 = calendar0.getTime(); 
java.sql.Timestamp currentTimestamp0 = new java.sql.Timestamp(now0.getTime()); 

BigInteger en = big.modPow(e, n); 

Calendar calendar1 = Calendar.getInstance(); 
java.util.Date now1 = calendar1.getTime(); 
java.sql.Timestamp currentTimestamp1 = new java.sql.Timestamp(now1.getTime()); 

を2つのタイムスタンプ、単に操作の前に1、その他を作成しました複数回。それは[200ns〜6ns]の範囲で時間を与えます

誰かが私が間違っているそのような結果の理由を指摘できますか?

+0

私はあなたのupvoteはここにnについては知らなかったことを指摘してくれてありがとう! – JoshMachine

答えて

3

まあまあ、あなたは非常に畳み込まれた方法であなたのタイミングについて考えています。 java.util.Dateだけ最寄りミリ秒の精度を持っており、その同じ値を使用してjava.sql.Timestampにそれを置くことは魔法のように、それをより正確にしないこと

long start = System.currentTimeMillis(); 
BigInteger en = big.modPow(e, n); 
long end = System.currentTimeMillis(); 

注:ここでは同じくらいの精度を与える何かではなく、単純です。だから、ミリ秒(6nsの-200nsの)下の任意の結果は明らかに偽である - 私はかどうかわからない - 基本的には、ミリ秒の下で何があなたがSystem.nanoTimeを使用して、より正確な測定値を得ることができるかもしれ0

ですそれはAndroidでサポートされています。利用可能な代替の高精度タイマーもあります。操作は、実際に記録された時間の非常に異なる量をとることが理由のためとして今

  • も1ミリ秒よりもかなり小さくてもよい上記使用されるシステムクロックの精度。それは15msのより小さいものを測定していない場合たとえば、あなたは彼らが実際に同じ時間がかかるていても、たぶんは0msを取り、いくつかの操作といくつかの撮影15msのを見ることができました。
  • 簡単に予想される時間は、数ミリ秒であるように関与する他の要因、最も明白なものガベージコレクション
+0

私はこのコードを_gives_精度と言っていますが、質問のコードはそうではありません。 –

+0

物事を和らげてくれてありがとう。私はアンドロイドでSystem.nanoTime()を試してみましたが、報告された時間の変動はまだあります。特定のプロセスがソフトウェアに費やした時間を報告するためのより良い方法を知っていますか?基本的にこのデータを使用して、同じプロセス(指数モジュラス演算)の時間をハードウェア/で比較します。 – JoshMachine

+0

@ JoshMachine:同じ操作を何回も何度も実行するのにかかる時間を測定するほうがよいので、非常に小さな時間を測定することの不正確さを心配する必要はありません。 –

1

は裁判でより多くの計算を行うが存在する場合があります。

は、logcatにあなたの出力を行うPC上でそれを記録してからのみ、ガベージコレクションや日常のバックグラウンド処理に関する介在することなく、プラットフォームのメッセージでトライアルを選択するにlogcatを処理して考えてみましょう。

1

実際のコンピュータ上で汎用オペレーティングシステムで実行されているエミュレートされたコンピュータ上で、汎用オペレーティングシステムで実行されている仮想マシンによってアプリケーションが実行されている。

あなたのアプリケーションを除いて、そのパイル内のすべてのもの(アプリケーションを実行するJVM、AndroidのLinux OS、エミュレータ、およびそれを実行するOS)は、何かを実行するためにCPUそれ以外の時間はいつでも可能です。これらのサイクルはプログラムの実行から離れ、ウォールクロックの実行時間に追加されます。結果は完全に非決定的な振る舞いです。

使用したエミュレータのCPUサイクルをカウントし、Javaが何をしているのかを割り引くと、実行時間の標準偏差が同じ入力で見られるものよりもずっと少ないことは間違いありません。エミュレートされたAndroid環境は、制御できない変数が多すぎるためベンチマークアルゴリズムとなる場所ではありません。

0

結論は、1つの関数しか実行できません。ずっと多くのことが続いています。 Java仮想マシンはもちろんのこと、実行中の他のすべてのプログラムも、基本的なLinuxオペレーティングシステムを制御することはできません。それを1000または10000回実行してみてください

関連する問題