C# /optimize标志启用了哪些运行时优化?

C# /optimize标志启用了哪些运行时优化?,c#,performance,optimization,compiler-optimization,jit,C#,Performance,Optimization,Compiler Optimization,Jit,长期以来,我一直认为C#编译器的/optimize标志做的不多。类似这样的文章描述了如何在IL中完成相对较少的优化:大多数都被降级到JIT 然而,最近我试图加快一些CPU密集型代码的速度(考虑大量对数组和字典以及简单的数值的迭代),我尝试打开优化只是为了好玩。结果是速度提高了3倍。请注意,这完全是通过单击VS项目属性页面中的“优化”复选框实现的。切换调试和跟踪常量对性能没有影响 虽然完全有可能是小规模的IL优化导致了这种变化,但这对我来说似乎相当令人惊讶。在阅读有关优化的文章时,我在以下内容中发

长期以来,我一直认为C#编译器的/optimize标志做的不多。类似这样的文章描述了如何在IL中完成相对较少的优化:大多数都被降级到JIT

然而,最近我试图加快一些CPU密集型代码的速度(考虑大量对数组和字典以及简单的数值的迭代),我尝试打开优化只是为了好玩。结果是速度提高了3倍。请注意,这完全是通过单击VS项目属性页面中的“优化”复选框实现的。切换调试和跟踪常量对性能没有影响

虽然完全有可能是小规模的IL优化导致了这种变化,但这对我来说似乎相当令人惊讶。在阅读有关优化的文章时,我在以下内容中发现了这一小贴士:

/optimize还告诉公共语言运行库在运行时优化代码 运行时

我很好奇这意味着什么。这是否意味着JIT不优化非优化程序集中的代码?这会启用哪些类型的优化?

打开项目的“构建”选项卡中的“优化代码”选项可以做两件事。它将/optimize+选项传递给C#编译器,执行您已经知道的次要MSIL优化。但它也让C#编译器在元数据中发出[DebuggableAttribute]属性。你会被设置为false

抖动使用它来决定是否要启用优化器。所以,是的,您现在已经启用了它,并且获得3倍的加速并不罕见

调试器也扮演了一个角色,它可以强制优化器自行关闭。相关设置为工具+选项、调试、常规、“抑制JIT优化”复选框。通常打开,这样在调试时就不会得到优化的代码。相当重要的是,优化的代码很难调试。当您想要查看优化的机器代码时,您希望关闭该选项


一定要记住你做错了什么。.NET项目的默认版本配置始终已选中“优化”选项。所以你有理由打开它是不符合逻辑的。仅对.NET项目的发布版本进行分析。

@DanielA.White:这似乎是针对IL优化的。你能给我指一下解决运行时问题的部分吗?@downvoter:为什么是downvoate?从你所说的,在打开或关闭optimize标志的情况下,代码似乎同样可以调试。在这种情况下,为什么要在开发人员迭代和运行单元测试时使用的调试版本中禁用它呢?不,您会丢失一些功能,例如无法在{curly braces}上设置断点。这些“小变化”。单元测试应该只测试发布版本,不测试与用户机器上运行方式不同的软件。尽管发布特定的bug并不常见。但浮点代码会发生这种情况。如果收到崩溃转储,优化后的代码很难调试,因为方法变量之类的东西可以优化掉。如果您收到的问题在本地无法再现,那么这将是一个巨大的负担,就像您的应用程序在无法在dev中复制的环境中与其他方交互时一样。