それはのような数学的な操作だ場合はループの内部状態が常に実行された場合、私は思っていた:私は、次のプログラム書かれているC++で実行されたループでも空ですか?
int margin = 100;
for(int i=0; i<margin/2;i++);//is margin divided by two at every cycle?
:別途2つのメソッドをテストするために
long margin = 1000000000, halfOfMargin = margin/2;
clock_t begin_time;
clock_t stop_time;
for(long j=0;j<10;++j)
{
begin_time = clock();
for(long i=0;i<margin/2;i++);
stop_time = clock();
cout <<"With margin/2 :"<< float(stop_time - begin_time)/CLOCKS_PER_SEC<<"\n";
}
for(long j=0;j<10;++j)
{
begin_time = clock();
for(long i=0;i<halfOfMargin;i++);
stop_time = clock();
cout <<"With halfOfMargin :"<< float(stop_time - begin_time)/CLOCKS_PER_SEC<<"\n";
}
を、 (乱雑なコードには申し訳ありません)。
私は、デバッグ設定では分割バージョンが2番目のaproachよりも速いと結論づけました。私が驚いたのは、Releaseに切り替えると、毎回各バージョンごとに0の出力が得られました。for
命令が実際に実行された場合には不可能でした(デバッグ構成では、各出力の時間は約2秒でした半分)。
私の質問は、それらが不必要であると判断した場合にコンパイラの指示をスキップすることが可能な場合、なぜそうでない場合はその2つのケースで時間が異なるかということです。
注:私はVisual Studio 2012 expressをIDEとしてデフォルトのコンパイラで使用しています。
オプティマイザは通常、スキップするのに非常に優れています。 – SLaks
f10とブレークポイントを使用して何が実行されるのか、実行されないのかを調べるだけです。 –
些細なことに時間を掛けようとするときに回避しなければならないことは一般的なことです。あなたが本当にアセンブリを確認することを知りたい場合。 – NathanOliver