|
|
1
8
据我所知,C编译器
不
优化这个,因为它不能确定副作用(例如,如果你有
从这个答案来看:
只是一个提示,既然埃里克是C编译器团队的成员,我相信他的答案:) |
|
|
2
6
一些随意的想法。 首先,正如其他人所指出的,尽管抖动是可以自由进行的,但是c编译器不会进行这种优化。 第二,回答一个表演问题的最好方法是试一试。秒表课是你的朋友。两种方法都试10亿次,看看哪个更快,然后你就会知道了。 第三,当然花时间优化已经足够快的东西是没有意义的。在花大量时间进行基准测试之前,先花点时间分析和寻找热点。这不太可能。 第四,另一个答案建议将中间结果存储在局部变量中。注意,在某些情况下这样做会使事情变得更快,而在另一些情况下,会使事情变得更慢。 有时不必要地重新计算结果比存储结果并在需要时再次查找它要快。 怎么会这样?有少量寄存器的芯片体系结构——我正在看你,x86——要求抖动非常明智,知道哪些局部变量进入寄存器,哪些进入堆栈访问。鼓励jitter将不经常使用的内容放入一个寄存器有时意味着将其他内容从该寄存器中强制出来,这将比不经常使用的值在寄存器中提供更多的好处。 简而言之:不要试着从你舒适的扶手椅上猜测抖动;现实世界中代码的行为可能非常违反直觉。根据实际的经验测量做出绩效决策。 |
|
3
3
好吧,C编译器不会进行这样的优化。但jit编译器确实是这样。您发布的所有getter都足够小,可以内联,从而直接访问该字段。 一个例子:
生成:
请注意构造函数调用和属性getter是如何消失的,它们是内联到main()中的。代码正在直接访问“速率”字段。即使calc变量不存在,引用也保存在eax寄存器中。 地址19处的指令表明可以在优化器上做更多的工作。时间允许。 |
|
|
4
2
要对此进行稍微不同的调整,请考虑在将代码编译为IL之后,属性实际上只是方法周围的包装器。因此,如果不是这样:
你有这个:
您希望编译器为您优化方法调用吗? 我不是抖动方面的专家,但我怀疑即使抖动也会“缓存”这个;当任何相关字段发生变化时,它必须跟踪各种状态并使条目无效,而且像.NET抖动一样棒,我只是不认为它有那么聪明。它可以内联方法,但这通常不会对性能产生很大影响。 总之,不要依赖编译器或jitter为您进行这些优化。另外,您可以考虑遵循不在属性getter中放入昂贵计算的通用设计准则,因为 出现 给打电话的人便宜一点,尽管可能不便宜。 如果需要性能,则在依赖字段更改时预计算这些值。或者,更好的是, 轮廓 使用如下工具的代码 EQATEC (免费)或 ANTS 看看性能成本到底在哪里。优化而不仿形就像蒙上眼罩拍摄一样。 |