发布版本与调试版本性能比较

5

发布版本通常比调试版本更快,因为发布版本进行了大量优化。即使我编写的是最快速度的性能代码,也是如此。

但是,使用调试模式编写的C ++代码是否可能与发布版本一样快呢?

我只是好奇我的代码是否太慢了,因为我在进行性能测试时注意到了明显的差异。


2
在进行性能分析时,应始终启用优化,因为除了极其简单的代码或内联汇编外,通常会生成不同的指令(甚至在库的情况下,也会编译不同的C++代码,例如在MSVC的STL实现中)。 - Thomas Russell
我也注意到了一个区别,对于简单的程序,其中包含小的方法调用(如getter/setter)- 当然是在循环中 - 没有任何其他库的情况下,即使我使用内联等方式来获得良好的性能。 - jeromintus
2
通常,Release构建将比Debug构建更快。但是,如果你好奇是否有可能编写出在Debug中更快的代码,答案是肯定的。虽然这可能有点棘手——例如,可以构造这样的代码,使得未经优化的汇编作为副作用加载一些稍后访问的高速缓存线路。 - MooseBoys
1
@Shaktal:你说在分析性能时应该始终启用优化。我认为这取决于你是仅仅测量性能还是积极寻找性能缺陷。这些是不同的目标。性能缺陷是指程序在执行某些不必要的操作时浪费了时间。你不能通过希望程序运行快来发现它。你需要通过调试它所花费的时间来找到它。优化器无法消除可能存在的不必要操作,但它可以使它们难以被发现。 - Mike Dunlavey
1
“Release build”和“Debug build”是由您制定的。它们只是不同的编译器标志集,被命名为这样是为了给人留下一个印象,即应该用一个来进行调试,另一个用于发布。通常(尽管这在很大程度上取决于应用程序领域),您不希望这样做,因为您想要调试您提供给客户的内容,反之亦然。Visual Studio IDE默认向所有新项目添加两个此类配置并不意味着这是C++软件开发的自然法则... - Christian Hackl
显示剩余2条评论
3个回答

16

选择一个好的算法肯定会在调试编译中速度上有很大差异,但是调试编译永远不可能像发布版本一样快。这是因为优化器完全以不同于调试编译的方式安排寄存器,尝试使代码运行更快,而调试编译器则试图保留临时变量的值,以便您可以从调试器中读取。

由于您可能拥有比CPU寄存器更多的变量,这意味着调试编译器将发出指令将这些值复制到RAM中。而在发布版本中,如果该值不再使用,优化器将直接将其丢弃。


0

一般而言,这取决于情况。

有些发布版本可能与调试版本没有区别。

还取决于调试版本和发布版本之间的配置差异。如果唯一的区别是调试版本中的符号信息,则它们将具有相同的性能。

在我的工作室里,我们正在发布调试软件。可执行文件不带任何符号进入Flash。


1
“也取决于调试版和发布版之间的配置差异。”为什么要用“也”呢?我会说“仅仅”… - Christian Hackl

0

如果您的代码中有数据结构验证,那么调试速度可能比发布版本慢很多。

另一方面,如果您的应用程序大部分时间都在调用系统例程,如I/O、内存分配、信号量等,则发布版本与调试版本的速度差别不大。

另外,如果您的程序具有使用大量自身时间的函数,则在发布版本中这些函数将更快。


为什么在发布版本中,具有大量自身时间的函数速度更快? - jeromintus
@Sleicreider:代码只有在程序计数器实际进入时才受益于优化,这就是自身时间。如果99%的时间程序计数器在内存分配、数学库或等待I/O,即使优化器无限加速您的代码,也不能节省超过1%的总体时间。 - Mike Dunlavey
在我的情况下,我使用了简单的方法调用,例如: string& GetText() { return text: } - jeromintus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接