2016-11-15 4 views
-1

コードの時間複雑さは分かっています。プログラムが実行されたシステムはIntel Corei3で、デュアルコアとCPU @ 2.4GHzです。これには4つの論理プロセッサがあります。 これらの詳細を使用して、コードの実行時間をどのように計算できますか?既知のO(n)とシステムクロックが既知のため、コードの実行時間を計算できます

public class PerfmTest { 
    public static void main(String[] args) { 
     getexeTime(1000000); 
    } 

    public static void getTime (long n) { 
     // long startTime = System.currentTimeMillis(); 
     long startTime = System.nanoTime(); 
     long k = 0; 
     for (int i = 1; i <=5; i++) { 
      // k = k + 5; 
     } 
     // long endTime = System.currentTimeMillis(); 
     long estimatedTime = System.nanoTime() - startTime; 
     //System.out.println("Execution time for n = " + n + " is " + (endTime - startTime) + " milliseconds"); 
     System.out.println("Execution time for n = " + n + " is " + estimatedTime + " nanoseconds"); 
    } 
} 

出力は855ナノ秒でした。

+1

私は、観察可能な副作用のないコードがコンパイル時に最適化できることを知らなかったと思います。それにかかわらず、あなたはこの運動で何を達成しようとしていますか? –

+0

私はコードが最適化されていることを知っています。しかし、ポイントは理論上どのようにO(n)であり、どのように2つのデュアルコアで動作するかです。私は教育援助プロジェクトに取り組んでいます。 – Uma

+2

理論的には、コンパイラはループを削除することができるので理論上はO(n)ではありません(ループの後には 'k'を読むことはできません - それを削除する副作用はありません。理論)。したがって、あなたの現在のコードは、理論上、 'O(1)'です。また、マイクロベンチマークに注意してください。 JITがあり、コールドランはウォームランとは異なります(JITをトリガーするために複数の実行が必要な場合があります)。 –

答えて

1

私が正しくあなたを理解していれば、我々は質問に、システムの仕様とコードを知ることによって、実行時間を計算することができれば、あなたが求めています。これに対する答えはではありません。実行時間は計算できません。

コードが単独で実行されないためです。これらの4つのプロセッサーはコードを実行しているのはではありません。オペレーティングシステムは、バックグラウンドで、サービスが実行中などの作業を行っています。

実際には、コードの実行時間を計算できないだけでなく、実行時間をすでに知っていても将来の実行時間を予測することさえできません。コードの2回目の実行中に出力を変更する可能性があります。より多くのコンテキストスイッチ、より多くのバックグラウンドタスク、または何か。

パフォーマンステストを実行しているときに、これらのエフェクトを何度も経験しました。コンピュータが長い間アイドル状態になっている場合や、スタンバイ/レジュームなどではなく、コールドブートの場合は、同じテストスイートが異なるタイミングを生成します。対策について質問している場合は、あなたのコードの実行時間は、上記のすべてが依然として適用されます。あなたは本質的に実験の実行について話しています。実験では、すべての外部変数を制御する必要があります。システムは、テストを実行するたびに同じ状態でなければなりません。これは技術的には達成可能ですが、この質問の範囲をはるかに超えています。

唯一のことであり、アルゴリズムAはアルゴリズムBよりも優れた性能を発揮すると予想されます(また、入力や入力サイズなどによっては予期しない結果が生じることもあります)。 できない正確にどのくらいアルゴリズムAがかかるか予測します。 (この質問の範囲を超えて)非常に制御された環境がなければ

概要

計算見積り、あるいはコードの任意の部分の走行時間を測定することは不可能です。

+0

私は複雑さを知っていて、反復ごとの処理時間を合理的に見積もることができますが、アルゴリズムのタイミングを見積もることはできません。 – Bohemian

+1

@ボヘミアン私たちはお互いにアルゴリズムの見積もりをよくすることができます - 私はそれには間違いありません。反復ごとの処理時間を合理的に見積もることができないため、絶対的なタイミングすべてで非常に良い見積りを行うことはできません。コンパイラ、ハードウェア、システムの状態、ソフトウェア、その他多くの要因によって変化します。さらに、これらのバリエーションはしばしば重要ではありません。プロのパフォーマンスアナリストとしての私の経験です。 – nhouser9

+0

@ Nhouser9のように、要点は比較のためだけに使われます。 @Uma right。 – Uma

-1

O(n)既知でシステムクロックは既知であるため、コードの実行時間を計算できます。

O(N)のみ、すなわち、実行時間がNとともに直線的に成長することを意味yは時間であるフォーム

t = aN+b 

の線形方程式を経て、NN、およびabは定数、ですが、それはあなたの定数を教えてくれません。

+0

実行時間を計算できないO(n)の画像を取得しました。 – Uma

+0

私はそれを解決策にしたいと思っていましたが、サイトには2つの解決策を記入することはできません。 – Uma

+0

私はそう言うかもしれませんが、私はこれを他のものよりも良い答えと考えています。もう一方は原理的には可能であると想定していますが、実際にはそうでない理由を述べています。言い換えれば、彼はあなたの誤謬を分かち合います。 – EJP

関連する問題