プロジェクトを終えたばかりですが、先生から質問があります。私のプログラム (同じアルゴリズム、同じデータ、同じ環境) が異なる時点で異なる終了時間で実行されるのはなぜですか? 誰でも私を助けることができますか?
例: 私のプログラムは 1.03 秒間実行されます。しかし、その後は 1.05 秒間実行されます (1.01 より速い場合もあります)。
That happens because your program is not the only entity executing in the system and it does not get all the resources immediately at all times.
For this reason it's practically of little value to measure short execution times as they are going to vary quite noticeably. Instead, if you're interested in more accurate time measurements, you should execute your code many times and calculate the average time of all runs.
Windows はリアルタイム オペレーティング システムではないためです。プログラムが実行されると、他の多くのアクティビティが発生する可能性があり、CPU はそのサイクルを他の実行中のプロセスと共有できます。プログラムがディスク (データベースも) およびネットとして物理デバイスから読み取る必要がある場合、時間はさらに変化する可能性があります。これは、物理リソースが他の要求の処理でビジー状態になる可能性があるためです。がある場合、メモリも変更される可能性があるpage faults
ため、アプリは仮想メモリからページを読み取る必要があり、その結果、パフォーマンスが低下します。C# を使用しているため、同じプロセス内の最初の実行から他の実行まで時間がかなり変化する可能性があります。これは、コードがJITtted
.フォーム、それは劇的に高速です。
簡単だ。システム リソースを使用するため不正確なカウンターを使用して、システムの時間差を取得します。あなたのプログラムと並行して実行されるプログラムが他にもあります。一部のプログラムはコードよりも優先され、スレッドが一時的に (OS の設定によっては最大 20 ミリ秒) 中断されます。DOS でさえ、あなたのコードと準並列で実行されるコードがあります。可能なスレッドが 1 つしかない場合、時間がまだ刻々と過ぎている間、コードは停止します (そのコードによって管理されます)。
ここでのアイデアですが、メモリ使用量の変化、バックグラウンド アプリケーションによる CPU 使用量の変化が原因である可能性があります。時差が唯一の違いを生み出すことを意味します。
お役に立てれば。乾杯。
仮定は間違っています。環境は同じままではありません。プログラムで利用できるリソースは、さまざまな要因によって異なります。たとえば、バックグラウンド プロセスなどの他のプロセスによる CPU およびメモリの使用率。他のプロセスによるハードディスクやネットワークの使用率。プログラムを実行している他のプロセスがなくても、キャッシュの内部状態が変更されます。
「現実世界」のパフォーマンス シナリオでは、「ウォームアップ」後に +/- 20% の変動が見られることは珍しくありません。つまり、「ウォームアップ」として 10 回続けて測定し、結果を破棄します。10 回以上測定し、結果を収集します。--> +/- 20% は非常に一般的です。ウォームアップを行わないと、「コールド」キャッシュにより数桁の違いが見られることさえあります。
結論: あなたのプログラムは非常に小さく、ほとんどリソースを使用しておらず、永続的なキャッシュ メカニズムの恩恵を受けていません。