Tag: jit ngen

.NET JIT编译性能(包括动态方法)如何受C#编译器的映像调试选项的影响?

我正在尝试优化我的应用程序,以便它在启动后立即运行良好。 目前,它的发行版包含304个二进制文件(包括外部依赖项),总计57兆字节。 它是一个主要进行数据库访问的WPF应用程序,没有任何重要的计算。 我发现Debug配置为大多数操作提供了更好的(~5倍增益)时间,因为它们是在应用程序进程的生命周期中第一次执行。 例如,在应用程序中打开特定屏幕,NGENed Debug需要0.3秒,JITted Debug需要0.5秒,NGENed Release需要1.5秒,JITted Release需要2.5秒。 我知道JIT编译时间的差距是由JIT编译器对Release二进制文件应用更积极的优化引起的。 据我所知,Debug和Release配置因传递给C#编译器的/p:DebugType和/p:Optimize开关而不同,但即使用/p:Configuration=Release /p:DebugType=full /p:Optimize=false构建应用程序,我也看到相同的性能差距/p:Configuration=Release /p:DebugType=full /p:Optimize=false – 即与/p:Configuration=Debug相同的映像调试选项。 我确认通过查看应用于生成的程序集的DebuggableAttribute应用这些选项。 观察NGEN输出,我看到添加到正在编译的一些程序集的名称中 – NGEN如何区分调试和非调试程序集? 正在测试的操作使用动态代码生成 – 动态代码应用了什么级别的优化? 注意:由于外部依赖性,我使用的是32位框架。 我应该期待x64有不同的结果吗? 注意:我也不使用条件编译。 因此,两种配置的编译源都相同。