組み込みシステムと初期の 8/16 ビット PC (6502、68K、8086) をプログラミングしていたとき、各命令の実行にかかる正確な時間 (ナノ秒またはマイクロ秒) をかなりよく把握していました。ファミリによっては、1 (または 4) サイクルが 1 回の「メモリ フェッチ」に相当し、キャッシュを気にする必要がなければ、関係するメモリ アクセスの数に基づいてタイミングを推測できます。
しかし、最近の CPU では混乱します。それらがはるかに高速であることは知っていますが、見出しのギガヘルツ速度は、各命令に必要なクロックのサイクル数を知らなければ役に立たないことも知っています.
したがって、2GHz Core 2 Duo (としましょう) で、2 つのサンプル命令のタイミングを誰かが提供できますか。最良のケースと最悪のケース (キャッシュに何もない/すべてがキャッシュにあると仮定) が役に立ちます。
命令 #1: 1 つの 32 ビット レジスタを 2 番目に追加します。
命令 #2: 32 ビット値をレジスタからメモリに移動します。
編集:私がこれを尋ねる理由は、単純なコードを見て、最も近い桁までの時間を大まかに測定できるようにする「経験則」を開発しようとすることです。
編集#2:興味深い点を含む多くの回答がありますが、(まだ)誰も時間で測定された数字を書き留めていません. 質問に「複雑さ」があることは承知していますが、おいでください: NYC のピアノ調律師の数を見積もることができれば、コードの実行時間を見積もることができるはずです...
次の (ダム) コードを使用します。
int32 sum = frigged_value();
// start timing
for (int i = 0 ; i < 10000; i++)
{
for (int j = 0 ; j < 10000; j++)
{
sum += (i * j)
}
sum = sum / 1000;
}
// end timing
実行にかかる時間をどのように見積もればよいでしょうか... 1 フェムト秒ですか? 1ギガ年?