我正在尝试优化我的应用程序,以便在启动后能够表现良好。目前,它的分发包含304个二进制文件(包括外部依赖项),总计57兆字节。这是一个WPF应用程序,主要进行数据库访问,没有任何重要的计算。
我发现,调试配置提供了更好的性能(大约快5倍),因为它们是在应用程序进程的生命周期内首次执行的。例如,在应用程序中打开特定屏幕需要0.3秒的NGENed Debug,0.5秒的JITted Debug,1.5秒的NGENed Release和2.5秒的JITted Release。
我理解JIT编译时间差距是由于JIT编译器对发布版本应用了更加激进的优化。从我所看到的情况来看,调试和发布配置不同取决于传递给C#编译器的/p:DebugType
和/p:Optimize
开关,但即使我使用 /p:Configuration=Release /p:DebugType=full /p:Optimize=false
构建应用程序,也会看到相同的性能差距 - 即与/p:Configuration=Debug
相同图像调试选项。
我通过查看应用到生成的程序集的DebuggableAttribute
来确认选项已经应用。观察NGEN输出,我看到一些正在编译的程序集名称中添加了<debug>
- NGEN如何区分调试和非调试程序集?正在测试的操作使用动态代码生成 - 对动态代码应用什么级别的优化?
注意:由于外部依赖关系,我使用32位框架。在x64上是否应该期望不同的结果?
注意:我也不使用条件编译。因此,编译后的源代码对于两个配置都是相同的。
#if DEBUG
(已编辑问题以反映此内容)。应用程序在发布时不一定会变慢 - 它甚至可能会更快,但我正在测量冷启动时间,而不是吞吐量。我怀疑是动态方法的 JITting,因此我想知道是什么决定了这些方法的优化级别。 - cynic