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

Laz*_*zlo 5 .net c# 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
Run Code Online (Sandbox Code Playgroud)

比较:

Release需要20倍的调试时间(平均比较).

4,404,500/213,000 = 20

现在第一次操作确实更长,但总的来说,所有其他时间也是如此.任何的想法?

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

Mic*_*ito 8

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

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

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

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

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


Laz*_*zlo 2

我想通了,我在我的依赖项构建之一中允许了不安全的代码。我仍然想知道为什么它会这样,但我必须进一步挖掘这一点。

感谢你的帮助!