Debug版本编译比发布版本慢得多

时间:2012-05-18 10:59:32

标签: c++ visual-studio build

在Visual Studio 2005下,我们有一个带有195个cpp文件的库,构建发布大约需要2分钟,但构建调试大约需要6分钟。

我一直认为发布版本需要更长时间才能进行优化。为什么调试版本需要比发布版本更长的时间?反正有没有加快我们的调试构建速度和发布速度一样快?

我们确实有相当数量的boost / stl代码。

2 个答案:

答案 0 :(得分:7)

最佳猜测:调试版本受I / O限制,而发布版本受处理器限制(在本例中)。

我们已经对构建系统进行了广泛的基准测试 - 许多大型项目,一些很小。 DEBUG版本会写出大量的*.pdb信息,更大的*.obj文件(用于额外的调试信息)等。结果是大量的磁盘活动。如果你的源代码中有很多“文字”(表格,符号,字符串文字)等,这就更加突出了。

相比之下,RELEASE版本会写出个较小的*.obj文件,并且不会编写“调试”数据库(如果编译RELEASE用典型的开关)。但是,RELEASE构建中的链接器必须进行优化以及其他明显更多的工作,这些工作在DEBUG中没有完成,因此它受处理器限制。如果您使用最具挑战性的链接器开关“编译到最大化速度/大小”,则RELEASE会进一步对时间进行处罚。

(但是,是的,RELEASE构建仍然必须在可执行文件内置I / O更新地址,但由于可执行文件在{{1构建,页面少得多,因此RELEASE构建中的I / O惩罚不如RELEASE构建那么多。)

您观察的是3x“DEBUGRELEASE更贵”。对于一些I / O绑定了大量模板,许多符号和文字等的项目来说,这是正确的。检查你的驱动器 - 它们是否已满,或者只是“慢速驱动”,和/或有一些坏扇区?这些会使DEBUG版本更糟糕(更慢)。

是的,其他构建应该是另一种方式,“DEBUGRELEASE贵3倍”。这些构建是处理器/链接器绑定,而不是I / O绑定。

[更新] ,我在问题评论中看到这是“静态库,无链接”。对于I / O(大量磁盘活动,没有链接)的时间损失,以及没有处理器惩罚(因为没有进行优化),这几乎是最糟糕的情况。所以,如果你有一个3x“DEBUG - 慢于 - DEBUG”,那可能就像它可以得到的那样糟糕(对于这个项目),这不是非典型的。添加链接选项时,RELEASE会变慢。

答案 1 :(得分:1)

我将把starbolin的评论放在这里作为答案:苹果和橘子。 charley对I / O限制的猜测似乎没有超出我的Process Monitor计算600MB写入调试和300MB发布。也就是说,写一个额外的300MB需要几秒钟,而不是4分钟。因此,我得出结论,Debug和Release版本之间可能只有很多不同之处。虽然优化应该花费的时间比没有优化要长,但这些其他仅调试活动必须花费更多时间。很高兴看到Debug和Release的确切位置细分,但很明显它们是完全不同的进程而且Debug需要花费更长的时间,至少对于Visual Studio 2005和我进行基准测试的项目而言。