When trying to test the speed of functions, I found that not all parts of my code work in Release
mode. The same code works perfectly in Debug
mode, though.
I'm using VC++ compiler with /O2
optimization.
Here's the cut out part, which doesn't work.
int main()
{
boost::timer::auto_cpu_timer t;
for(int i = 0; i < 1000000; i++)
gcdb(i, 5);
return 0;
}
The generated assembly in release mode, the code for the for loop is missing only in this mode.
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()
is just a function for the finding the GCD of two numbers.
What could be causing this code skipping?
What you're seeing here is a compiler optimization known as Dead Code Elimination.
When the compiler sees that the result of some code is not needed, it is free to eliminate it. This is a standard optimization employed by all modern compilers.
A work-around to keep the compiler from optimizing it out is to actually use the output in some way:
int main()
{
boost::timer::auto_cpu_timer t;
int sum = 0;
for(int i = 0; i < 1000000; i++)
sum += gcdb(i, 5);
cout << sum << endl;
return 0;
}
Related: How does GCC optimize out an unused variable incremented inside a loop?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With