2

私の質問はこれです:

分離された 1 行のコード (つまり、解析せず、HDD 上のファイルの読み取り/書き込み、サブルーチンではないなど) が与えられた場合、どの程度の精度および/または一貫性を持って予測または測定することが可能ですか?特定のシステムでコードを実行するのにかかる時間は?

たとえば、次のコードがあるとします (特定の言語ではなく、単なる一般化です)。

1 |  If x = 1 then
2 |    x = x + 1
3 |  End If

2行目を実行するのにどれくらい時間がかかりますか?

ここで数字を探しているわけではありません。そのようなことが可能か実用的かどうか疑問に思っています。

ありがとう!

アップデート:

今、私はいくつかの数字を探しています...単純にFor繰り返しごとに 1 秒スリープする単純なループを実行するとしたら、60 (実際の) 分後にどれくらい離れているでしょうか? 言い換えれば、分離されたコードの行を評価するのにかかる時間は無視できると見なすことができますか (エラーや割り込みがないと仮定して)?

4

5 に答える 5

3

このようなドキュメントを見ると、CPU で基本的な操作にかかるクロック サイクル数と、それらのクロック サイクルの長さがわかります。これらの数値をプログラムで実行するのにかかる時間に変換することx = x+1は不正確な科学ですが、コンパイラが生成するアセンブリ コード リストを調べることで、ある種の手がかりが得られます。

単純な算術ステートメントから大規模なプログラムに移行するにつれて、科学はますます正確さを失い、最新の CPU や最新のオペレーティング システム、メモリ階層などの複雑さから生じるあらゆる種類の問題に直面し始めます。

于 2012-07-06T09:47:43.307 に答える
1

Big O Notationについて学びたいと思われるかもしれません。Big O を使用すると、実行中のマシンの速度に関係なく、最も効率的なアルゴリズムを作成する方法を理解できます。

通常、ほとんどのコンピューターには、バックグラウンドで実行されているプロセス、サービス、またはその他の「ジョブ」があり、さまざまな理由でさまざまなタイミングでリソースを消費します。これにより、正確な実行時間を予測することが難しくなる傾向があります。ただし、上記のコードをアセンブリ言語に分解し、マシン レベルで使用されるビット数、レジスタ数、およびクロック ティック数を計算できれば、正確な見積もりを得ることができると思います。

于 2012-07-06T09:52:15.467 に答える
1

最も簡単な方法は、それを 10 億回実行し、かかった時間を確認してから、10 億で割ることです。これにより、クロック精度の問題が解消されます。

于 2012-07-06T09:46:48.427 に答える
1

答えは圧倒的にノーです。たとえば、追加中に割り込みが発生した場合に何が起こるかを考えてみましょう。割り込みが処理された後に次の命令が実行されるため、追加に非常に多くの時間がかかったように見えます。

ISR 無効状態について話している場合、答えは「場合による」です。たとえば、 での分岐の予測ミスによりif、実行が大幅に遅くなる可能性があると考えてください。マルチコア CPU についても同じことが言えます (多くの場合、一部の ALU はコア間で共有されるため、コアでのアクティビティが他のコアでの操作のパフォーマンスに影響を与える可能性があります)。

シングル コアとシングル ステージ パイプラインを備えた CPU で ISR が無効になっている状態について話している場合は、所要時間をほぼ予測できるはずです。問題は、おそらくマイクロコントローラー (およびその時点で古いもの) で作業している可能性があることです。:)

更新: よく考えてみると、最後のケースであっても、おそらく正確に予測することはできないでしょう: 実際、一部の演算はデータに依存しています (標準的な例は、非正規数の浮動小数点演算です)。

于 2012-07-06T09:59:27.063 に答える