在 Visual Studio 2005 下,我们有一个包含 195 个 cpp 文件的库,构建发布大约需要 2 分钟,而调试构建大约需要 6 分钟。
由于优化,我一直认为发布版本应该需要更长的时间。为什么调试版本会比发布时间长这么多?有没有办法让我们的调试构建速度与发布一样快?
我们确实有大量的 boost/stl 代码。
在 Visual Studio 2005 下,我们有一个包含 195 个 cpp 文件的库,构建发布大约需要 2 分钟,而调试构建大约需要 6 分钟。
由于优化,我一直认为发布版本应该需要更长的时间。为什么调试版本会比发布时间长这么多?有没有办法让我们的调试构建速度与发布一样快?
我们确实有大量的 boost/stl 代码。
最佳猜测:调试版本受 I/O 限制,而发布版本受处理器限制(在这种情况下)。
我们已经对我们的构建系统进行了广泛的基准测试——许多大型项目,一些小型项目。DEBUG
构建写出大量*.pdb
信息,更大的文件*.obj
(用于额外的调试信息)等。结果是大量更多的磁盘活动。如果您的源代码中有很多“文字”(表格、符号、字符串文字)等,这一点会更加突出。
相比之下,RELEASE
构建会写出小得多的*.obj
文件,并且不会费心编写“调试”数据库(如果您RELEASE
使用典型的开关进行编译)。但是,RELEASE
构建中的链接器必须进行优化和其他更多的工作,而这些工作在DEBUG
. RELEASE
如果您使用最具挑战性的链接器开关“编译以最大化速度/大小”,这将进一步受到时间惩罚。
(但是,是的,RELEASE
构建仍然必须 I/O update-the-addresses in the executable-being-built-on-disk,但由于RELEASE
构建中的可执行文件要小得多,因此您的分页要少得多,所以 I/构建中的O 惩罚RELEASE
不如DEBUG
构建中的多。)
您正在观察 3 倍的“RELEASE
比DEBUG
”更贵。这对于一些 I/O 绑定的项目来说是正确的,这些项目有很多模板、许多符号和文字等。检查你的驱动器——它们是否已满,或者只是“慢速驱动器”,和/或有一些坏扇区? 这些会使构建变得更糟(更慢)DEBUG
。
是的,其他构建应该是相反的,“RELEASE
比 3x 贵DEBUG
”。这些构建是处理器/链接器绑定的,而不是 I/O 绑定的。
[更新],我在问题评论中看到这是针对“静态库,无链接”的。对于 I/O 的时间惩罚(大量磁盘活动,没有链接),并且没有处理器惩罚(因为没有进行优化),这几乎是最坏的情况。所以,如果你有一个 3 倍的“ DEBUG
-is-s-slower-than- RELEASE
”,这可能是它所能得到的最糟糕的(对于这个项目),这不是非典型的。添加链接选项时,RELEASE
速度会变慢。
我将把starbolin 的评论放在这里作为答案:苹果和橙子。charley 对 I/O 受限的猜测似乎与我为调试编写的 600MB 和用于发布的 300MB 的 Process Monitor 计算不相符。也就是说,写入额外的 300MB 需要几秒钟,而不是 4 分钟。因此,我得出结论,Debug 和 Release 版本之间可能只有一堆不同的东西。尽管优化应该比不优化花费更长的时间,但这些其他仅调试活动必须花费更多时间。很高兴看到调试和发布的确切时间细分,但很明显它们是完全不同的过程,调试只需要更长的时间,至少对于 Visual Studio 2005 和我进行基准测试的项目。