5

我正在使用 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 秒。我开始对此感到非常绝望——这对我的应用程序来说是一个严重的性能问题。有没有人猜测如何解决这个问题?

4

3 回答 3

8

时间上的差异可能是由于加载操作所需的组件的时间发生了变化。

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

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

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

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

于 2010-04-06T03:32:42.017 回答
2

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

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

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

于 2010-04-08T19:24:58.757 回答
1

我想通了,我允许在我的一个依赖项构建中使用不安全的代码。我仍然想知道为什么它会这样,但我必须再深入一点。

感谢你的帮助!

于 2010-04-13T17:10:23.457 回答