我正在使用 MySql Connector .NET 加载帐户并将其转移到客户端。 考虑到要加载帐户的子元素,此操作相当密集。
在 Debug模式下,最多需要 1 秒来加载帐户。平均值为 500 毫秒。 在 Release模式下,加载帐户需要 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 秒。我开始对此感到非常绝望——这对我的应用程序来说是一个严重的性能问题。有没有人猜到如何解决这个问题?
最佳答案
时间上的差异可能是由于加载操作所需的程序集的时间发生了变化。
在 Release模式下,运行时可能不需要立即加载您的操作稍后才需要的程序集(因为对发布构建执行了各种优化)。因此,在 Debug模式下,程序集可能会在您开始为您的操作计时之前加载,而在 Release模式下,该程序集可能会在您开始为您的操作计时后加载。加载程序集的时间可能很长,具体取决于程序集的大小。当然这两种情况都要加载程序集,而且只需要加载一次,所以后续在 Release模式下运行可能会更快。
尝试在一个循环中多次执行您的操作并忽略第一次执行以找到平均更少的启动开销。
更新:
有趣的是,与 Debug模式相比, Release模式的时间变化很大( Release模式的 std dev 高 100 倍)。在低端, Release模式时序与 Debug模式下的时序相当。您在问题中提到,由于必须加载所有子元素,因此加载帐户很费力。另一个区别可能是运行时决定执行垃圾收集的时间点。要进行测试,您可以尝试在每次操作后(在您的计时器之外)执行 System.GC.Collect()
并查看是否会发生变化。
更新: 如果您怀疑锁定方面的行为可能发生变化,您可以考虑在调试和 Release模式下运行测试时使用 Windows 性能监视器来监视应用程序进程的各种 .NET CLR LocksAndThreads 计数器.也许您没有在某处正确释放锁并且执行被延迟直到超时失效?如果是这样,我希望看到性能计数器报告的争用率增加。我不确定为什么这只会成为发布版本的问题(除非您在运行调试版本时实际使用调试器)。
关于c# - Debug 和 Release 之间有什么(性能)差异吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2582383/