If you intend to optimize your software’s performance, make sure to profile the release version rather than the debug version. The debug version of the executable contains additional code (about 40% extra compared to the equivalent release executable) for symbol lookup and other debug “scaffolding.” In addition, most compilers have distinct implementations of operator new in debug and release versions. The debug version of new initializes the memory it allocates with a unique value and adds a header at block start. Release version of new doesn’t perform any of these actions. Furthermore, a release version of an executable is aggressively optimized in the following ways:
- Elimination of unneeded variables
- Loop flattening
- Register storage
- Inlining
For these reasons, you can’t deduce from a debug version where the actual bottlenecks are located.
Debugging and optimizations are two distinct operations. Use the debug version to chase bugs and logical errors, and profile the release version to optimize it.