我必须承认,通常我不会费心在程序中的Debug和Release配置之间切换,我通常选择Debug配置,即使程序实际上部署在客户的位置。

据我所知,如果不手动更改,这些配置之间的唯一区别是Debug定义了Debug常量,而Release检查了优化代码。

所以我的问题实际上是双重的:

这两种配置在性能上有很大差异吗?是否有任何特定类型的代码会导致性能上的巨大差异,或者它实际上并不那么重要? 是否有任何类型的代码可以在调试配置下正常运行,但在发布配置下可能失败,或者您能否确定在调试配置下测试并正常运行的代码在发布配置下也可以正常运行。


当前回答

我会说

很大程度上取决于您的实现。通常情况下,差别并没有那么大。我做了很多测量,但经常看不到区别。如果你使用非托管代码,大量的巨大数组和类似的东西,性能的差异会稍微大一些,但不是一个不同的世界(像在c++中)。 通常在发布代码中会显示更少的错误(更高的容忍度),因此开关应该可以正常工作。

其他回答

这在很大程度上取决于应用程序的性质。如果您的应用程序是ui密集型的,您可能不会注意到任何不同,因为连接到现代计算机的最慢的组件是用户。如果您使用一些UI动画,您可能想要测试在DEBUG版本中运行时是否能察觉到任何明显的延迟。

然而,如果您有很多计算量大的计算,那么您就会注意到差异(可能高达40%,正如@Pieter所提到的,尽管这取决于计算的性质)。

这基本上是一种设计权衡。如果您在DEBUG版本下发布,那么如果用户遇到问题,您可以获得更有意义的回溯,并且可以进行更灵活的诊断。通过在DEBUG版本中发布,你也可以避免优化器产生模糊的Heisenbugs。

是的,存在许多性能差异,这些差异确实适用于您的所有代码。调试很少做性能优化,而发布模式做得很多; 只有依赖于DEBUG常量的代码在发布版本中才能有不同的表现。除此之外,你应该看不到任何问题。

依赖于DEBUG常量的框架代码的一个例子是DEBUG . assert()方法,它具有属性[条件("DEBUG)”)的定义。这意味着它也依赖于DEBUG常量,而这并不包含在发行版中。

我知道我的答案很晚,我的答案并不完全是你想要的,但是,我认为一些坚实而简单的例子会很好。不管怎样,这段代码导致了调试和发布之间的巨大差异。代码是在Visual Studio 2019上用c++编写的。代码是这样的:

#include <iostream>

using namespace std;

unsigned long long fibonacci(int n)
{
    return n < 2 ? n : (fibonacci(n - 1) + fibonacci(n - 2));
}

int main()
{
    int x = 47;

    cout << "Calculating..." << endl;
    cout << "fib(" << x << ") = " << fibonacci(x) << endl;
}

编辑: 计算斐波那契数列的性能差异

                       Debug        Release         
                C++ x86 C++ x64 C++ x86 C++ x64 C# Debug    C# Release
Time (mSeconds) 99384.9 27799.1 11066.0 11321.5 95233.7 24566.0
Time (Seconds)  99.4    27.8    11.1    11.3    95.2    24.6

我会说

很大程度上取决于您的实现。通常情况下,差别并没有那么大。我做了很多测量,但经常看不到区别。如果你使用非托管代码,大量的巨大数组和类似的东西,性能的差异会稍微大一些,但不是一个不同的世界(像在c++中)。 通常在发布代码中会显示更少的错误(更高的容忍度),因此开关应该可以正常工作。

在我的经验中,发布模式中最糟糕的事情就是晦涩的“发布漏洞”。由于IL(中间语言)是在发布模式下优化的,因此存在在调试模式下不会出现的错误的可能性。还有其他关于这个问题的SO问题: 在调试模式中不存在发布版本中的错误的常见原因

这种情况在我身上发生过一两次,一个简单的控制台应用程序在调试模式下运行得很好,但给定完全相同的输入,在发布模式下就会出错。这些bug极其难以调试(讽刺的是,根据发布模式的定义)。