Under Visual Studio 2005 we have a single library w/ 195 cpp files which takes about 2 minutes to build for release but about 6 minutes to build for debug.
I always thought release builds should take longer because of optimization. Why would a debug build take so much longer than release? Is there anyway to speed our debug build up to be as fast as release?
We do have a fair amount of boost/stl code.
Best guess: Debug-builds are I/O-limited, while Release-builds are processor-limited (in this case).
We've done extensive benchmarking on our build system -- lots of large projects, some small. The DEBUG
builds write out lots of *.pdb
information, much larger *.obj
files (for the extra debugging information), etc. The result is massively-more disk activity. This is accentuated even further if you have lots of "literals" in your source code (tables, symbols, string-literals), etc.
In contrast, the RELEASE
builds write out much smaller *.obj
files, and doesn't bother writing the "debug" databases (if you compile RELEASE
with typical switches). However, the linker in RELEASE
builds has to do its optimizations and other significantly-more work that is just not done in DEBUG
, so it's processor-bound. This is further time-penalized for RELEASE
if you "compile-to-maximize-speed/size" with the most challenging-to-the-linker switches.
(However, yes, the RELEASE
build must still I/O update-the-addresses in the executable-being-built-on-disk, but since the executable is so much smaller in the RELEASE
build, you page much less, so the I/O penalty in RELEASE
build is not as much as for DEBUG
build.)
You're observing a 3x "RELEASE
is more expensive than DEBUG
". That's about right for some projects that are I/O-bound with lots of templates, many symbols and literals, etc. Check your drives -- are they getting full, or just "slow-drives", and/or with some bad sectors? Those will make it worse (slower) for the DEBUG
builds.
Yes, other builds should be the other-way-around, with "RELEASE
something like 3x more-expensive than DEBUG
". Those builds are processor/linker-bound, rather than I/O-bound.
[UPDATE], I see in the comment-on-the-question that this is for "static-library, no-linking". That's pretty-much the worst-case-scenario for a time-penalty for I/O (lots of disk activity, no linking), and without a processor-penalty (since no optimizations are being done). So, if you have a 3x "DEBUG
-is-slower-than-RELEASE
", that's probably about as bad as it can get (for this project), and that's not atypical. When you add linking options, the RELEASE
will get slower.
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