プロセッサ速度が特定のループの実行時間にどのように影響するかについて、次の概念を理解するのに苦労しました。
3GHz プロセッサを搭載し、1 サイクルあたり 64 ビット演算を実行できるコンピューターの場合、次のループはどのくらいの時間実行されますか?
long long int x; for(x = 0 x<=0; x--){}
コンパイラは、結果が使用されていないことを検出する可能性があるため、このループを完全に最適化する可能性があります。
しかし、ループが実際にコンパイルされている場合、速度の上限は反復ごとに 2 サイクルになると推測されます。はい、プロセッサはおそらくスーパースケーラであるため、1 サイクルで複数の命令を実行できる場合がありますが、一方で、1 つの命令は分岐であり、パイプラインを壊す傾向があります。
したがって、2 つのサイクルを推測すると、そのループを実行するのに約 1 世紀かかります。
irb> 2**63/(3*10**9)/60/60/24/7/52 # => 97 years
これはサーバー、UPS 機器、および電力網の MTBF よりもはるかに長いため、ループが終了することはないと言いたくなりますが、VM で実行して定期的にチェックポイントを設定することもできます。:-)
もちろん、経験的証拠が利用できる場合、憶測の愚かさに関するギリシャの寓話があります。ループを短時間実行してから、2 63回の反復の実際の結果を計算してみませんか? 今日の複雑なマイクロアーキテクチャを本当に理解しているのは、設計者以外にはほとんどいないため、推測は困難です。多くの実際的な問題もあります: コンパイラはループをアンロールできますか? おそらく、特定のものを測定できるように、アセンブリで記述する必要がありますか?