【问题标题】:Release build vs. Debug build performance [closed]发布构建与调试构建性能[关闭]
【发布时间】:2014-10-23 21:21:45
【问题描述】:

发布版本总是比调试版本快吗(因为发布版本优化了很多)?即使我编写了性能最快的代码?

或者是否可以编写与 Release Build 一样快的 C++ 代码(使用调试)?

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

【问题讨论】:

  • 在进行分析时,您应该始终启用优化运行,因为除了极其简单的代码或内联汇编之外,通常会生成不同的指令(甚至,在库的情况下,将编译不同的 C++ 代码,例如在 STL 的 MSVC 实现中)。
  • 我也注意到一个不同之处,对于具有小方法调用(getett/setter)的简单程序 - 当然是在一个循环中 - 没有任何其他 liaberies,即使我使用内联等来获得一个好的性能
  • 一般来说,发布版本会比调试版本快。但是,如果您好奇是否可能在 Debug 中编写更快的代码,答案是肯定的。不过这会很棘手 - 一个示例可能是构建代码,以便加载未优化的程序集,作为副作用,加热一些稍后访问的缓存行。
  • @Shaktal:你说在分析时你应该总是在启用优化的情况下运行。我认为这取决于您是简单地衡量性能还是积极尝试寻找性能错误。这些是不同的目标。性能错误是程序浪费时钟时间做一些不必要的事情。你不会希望程序很快就能找到它。您可以通过debugging what it is spending time on 找到它。优化器无法删除一个人可能正在做的不必要的事情,但它会使它们难以找到。
  • “发布版本”和“调试版本”是您制作的。它们只是不同的编译器标志集,这样命名是为了给人一种印象,即一个应该用于调试,另一个用于发布。通常(尽管它在很大程度上取决于应用程序域),您确实想要这个,因为您想调试您提供给客户的东西,反之亦然。 Visual Studio IDE 默认为所有新项目添加两个这样的配置这一事实并不意味着这是 C++ 软件开发的自然规律......

标签: c++ performance debugging release


【解决方案1】:

一个好的算法选择肯定会对调试构建的速度产生很大的影响,但调试构建永远不会那么快。这是因为优化器对寄存器的调度完全不同,试图让代码运行得更快,而调试编译器试图保留临时变量的值,以便您可以从调试器中读取它们。

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

【讨论】:

    【解决方案2】:

    一般来说,这取决于。

    某些发布版本可能与调试版本没有什么不同。

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

    在我的商店,我们正在发布调试软件。可执行文件在没有任何符号的情况下进入 Flash。

    【讨论】:

    • “也取决于调试和发布构建之间的配置差异。” 为什么是“也”?我会说“只有”...
    【解决方案3】:

    如果您的代码中有数据结构验证,它可能会使调试比发布慢很多。

    另一方面,如果您的应用属于将大部分时间用于调用系统例程(例如 I/O、内存分配、信号量等待等)的类型,那么发布不会比调试快多少。

    另一方面,如果您的程序具有使用大量自用时间的功能,那么在发布版本中这些功能会更快。

    【讨论】:

    • 为什么在发布版本中拥有大量自用时间的函数会更快?
    • @Sleicreider:代码只受益于程序计数器实际在其中的那部分时间的优化,这就是自我时间。如果程序计数器 99% 的时间都在内存分配、数学库或等待 I/O,那么即使优化器无限加速你的代码,它也不能节省超过 1% 的整体。
    • 就我而言,我使用了简单的方法调用,例如:string& GetText() { return text: }
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多