Debug和Release之间有(性能)差异吗?

时间:2010-04-06 02:48:55

标签: c# .net mysql mysql-connector

我正在使用MySql Connector .NET加载帐户并将其传输到客户端。 考虑到要加载的帐户的子元素,此操作相当密集。

在调试模式下,加载帐户最多需要1秒钟。平均值为500毫秒。 在发布模式下,加载帐户需要1到4秒。平均值为1500毫秒。

由于我的代码中没有#if DEBUG指令等,我想知道差异来自何处。

我可以更改项目构建选项吗?或者它与MySql Connector .NET有什么关系,根据构建模式会有不同的行为?

编辑:进行监控。

Debug (Average: 213000 ticks)
730000
320000
60000
50000
190000
130000
210000
180000
160000
110000
390000
270000
150000
190000
230000
210000
150000
200000
190000
140000

Release (Average: 4404500 ticks)
12940000
170000
180000
80000
80000
130000
120000
5060000
5090000
130000
50000
10430000
25160000
150000
160000
130000
17620000
10160000
100000
150000

比较:

发布需要20倍的调试时间(平均比较)。

4,404,500 / 213,000 = 20

现在第一个操作确实更长,但总的来说,所有其他时间都是如此。 有什么想法吗?

编辑2 :我添加了更广泛的测试来计算总时间。对于50个帐户加载,调试平均需要4秒,发布时需要40秒。我开始对此非常绝望 - 这对我的应用程序来说是一个严重的性能问题。有没有人猜测如何解决这个问题?

3 个答案:

答案 0 :(得分:8)

时间上的差异可能是由于加载操作所需的装配时间的变化所致。

在发布模式下,运行时可能不需要立即加载仅在您的操作稍后需要的程序集(因为对发布版本执行了各种优化)。因此,在调试模式下,可能会在开始计时操作之前加载程序集,而在发布模式下,程序集可能会在您开始计时操作后加载。加载组件的时间可能很大,具体取决于组件的大小。当然,必须在两种情况下加载程序集,并且只需加载一次,因此在发布模式下的后续运行可能会更快。

尝试在循环中多次执行您的操作,并忽略第一次执行以找到平均较少的启动开销。

<强>更新 有趣的是,与调试模式下的时间相比,发布模式中的时序变化很大(std dev在发布模式下高出100倍)。在低端,释放模式时序与调试模式下的时序相当。您在问题中提到加载帐户是密集的,因为必须加载所有子元素。另一个区别可能是运行时决定执行垃圾收集的点。要进行测试,您可以尝试在每次操作后(在计时器之外)执行System.GC.Collect(),看看是否会改变。

<强>更新 如果您怀疑锁定行为可能发生变化,您可以考虑使用Windows性能监视器监视应用程序进程的各种.NET CLR LocksAndThreads计数器,同时在调试和释放模式下运行测试。也许你没有在某个地方正确释放锁定并且执行被延迟直到超时失效?如果是这样,我预计会看到性能计数器报告的争用率增加。我不确定为什么这只会是发布版本的问题(除非您在运行调试版本时实际使用调试器)。

答案 1 :(得分:2)

应用程序属性设置中“构建”和“调试”选项卡上的所有内容都可以根据构建配置进行更改。其中一些仅涉及编译阶段,不会影响运行时性能(允许不安全的代码,错误和警告,将警告视为错误,以及XML文档文件)。其他人可能会有所作为。

我会注意配置之间不同的每个设置,然后更改每个设置以使配置匹配,在每个更改之间进行测试。然后你应该能够找到问题的根源。

我特别测试定义DEBUG常量,定义TRACE常量,条件编译符号,平台目标,优化代码,(在高级屏幕上)检查算术溢出/下溢,生成序列化程序集,启用非托管代码调试,以及启用Visual Studio托管过程。

答案 2 :(得分:1)

我明白了,我在其中一个依赖项构建中允许不安全的代码。 我仍然想知道它为什么会这样,但我还要再挖一点。

感谢您的帮助!

相关问题