機能の速度をテストしようとすると、私のコードのすべての部分がRelease
モードで動作するわけではありません。しかし、同じコードはDebug
モードでは完全に機能します。コードの一部をスキップするリリースモード
私は/O2
最適化でVC++コンパイラを使用しています。
ここでは切り取った部分がありますが、これは機能しません。
int main()
{
boost::timer::auto_cpu_timer t;
for(int i = 0; i < 1000000; i++)
gcdb(i, 5);
return 0;
}
リリースモードで生成されたアセンブリでは、forループのコードがこのモードでのみ失われています。
int main()
{
000000013F8E1280 sub rsp,88h
000000013F8E1287 mov rax,qword ptr [__security_cookie (013F8E7150h)]
000000013F8E128E xor rax,rsp
000000013F8E1291 mov qword ptr [rsp+70h],rax
boost::timer::auto_cpu_timer t;
000000013F8E1296 lea rcx,[t]
000000013F8E129B mov edx,6
000000013F8E12A0 call boost::timer::auto_cpu_timer::auto_cpu_timer (013F8E2DA0h)
for(int i = 0; i < 1000000; i++)
gcdb(i, 5);
return 0;
000000013F8E12A5 lea rcx,[t]
000000013F8E12AA call boost::timer::auto_cpu_timer::~auto_cpu_timer (013F8E2810h)
000000013F8E12AF xor eax,eax
}
gcdb()
2つの数の最大公約数を見つけるためだけの機能です。
このコードをスキップする原因は何ですか?
コンパイラはそれを最適化しますが、それはいい理由ではありませんか? –
その部分を最適化しないようにすることはできますか? – SMK
ループ外の変数を宣言し、 'gcdb()'の結果を代入してみてください。 – lapk