3 回答
TA贡献1834条经验 获得超8个赞
方法衬里。将方法调用替换为注入该方法的代码。这是一个很大的问题,它使属性访问器基本上是免费的。 CPU寄存器分配。局部变量和方法参数可以保存在CPU寄存器中,而不会(或不太频繁)存储回堆栈帧。这是一个很大的问题,因为它使得调试优化代码变得如此困难。并给出 易挥发关键字的意思。 数组索引检查消除。处理数组时的一个重要优化(所有.NET集合类都在内部使用数组)。当JIT编译器可以验证一个循环从不索引超出界限的数组时,它将消除索引检查。大的。 循环展开。通过在主体中重复代码4次并减少循环,可以改进具有小体的循环。降低了分支成本,并改进了处理器的超标量执行选项。 死代码消除。如if(False){/ .../}被完全淘汰。这可能是由于不断的折叠和内衬。其他情况是JIT编译器可以确定代码没有可能产生副作用。这种优化使得分析代码变得如此棘手。 代码提升。循环中不受循环影响的代码可以从循环中移出。C编译器的优化器将花费更多的时间来寻找提升的机会。然而,这是一个昂贵的优化,因为需要的数据流分析和抖动无法负担的时间,所以只有提升明显的情况。迫使.NET程序员编写更好的源代码并提升自己。 常见的子表达式消除。x=y+4;z=y+4;变成z=x;在语句中非常常见,如DEST[ix+1]=src[ix+1];为可读性而编写,而不引入辅助变量。不需要妥协可读性。 不断折叠。x=1+2;变成x=3;这个简单的示例被编译器提前捕获,但在JIT时发生,而其他优化使得这成为可能。 复制传播。x=a;y=x;变成y=a;这有助于寄存器分配器做出更好的决定。这在x86抖动中是一个很大的问题,因为它几乎没有什么寄存器可以使用。让它选择正确的选择是Perf的关键。
TA贡献1757条经验 获得超7个赞
是的,有许多性能差异,这些都适用于您的代码。调试很少进行性能优化,并且发布模式非常多; 只有依赖于 DEBUG
常数在发行版构建中可能执行不同的操作。除此之外,你不应该看到任何问题。
DEBUG
Debug.Assert()
[Conditional("DEBUG)"]
DEBUG
- 3 回答
- 0 关注
- 587 浏览
添加回答
举报