我想知道这些信息以减少我的代码大小,所以我不会浪费时间来优化将由编译器或JIT完成的事情。
例如:
如果我们假设编译器内联调用属性的get函数,那么我不必将返回值保存在局部变量中以避免函数调用。
我想推荐一个很好的参考资料来描述正在发生的事情?
答案 0 :(得分:18)
您可能想看一下这些文章:
JIT Optimizations - (Sasha Goldshtein - CodeProject)
Jit Optimizations: Inlining I (David Notario)
Jit Optimizations: Inlining II (David Notario)
说实话,你不应该过分担心这种微观细节。让编译器/ JIT'er为你担心,它比你在几乎所有情况下都要好。不要挂在Premature Optimisation上。专注于让你的代码工作,然后担心如果(a)它运行得不够快,(b)你有'大小'问题,那么以后会进行优化。
答案 1 :(得分:17)
如果您担心性能,请运行探查器。 然后更改代码。有可能你将永远不会百万年在正确的时间里正确地猜测。你可以改变0.02%的时间,并留下造成62%负担的方法。你也可能让它变得更糟。没有剖析器和证据,你就是盲人。
您不能假设 JIT将内联属性getter。它可能会或可能不会有很多原因;方法体的大小,虚拟,值与引用类型,体系结构,附加的调试器等。
“吊装”仍然占有一席之地,如果代码在紧密循环中重复调用,仍然可以实现节省;例如:
var count = list.Count;
for(int i = 0 ; i < count ; i++) {...}
(忘记上面的for
vs foreach
辩论 - 这是正交讨论)。在上面,“提升机”将有助于提高性能。但只是为了真的令人困惑 - 对于数组,它是相反的,并且不提升它更有效:
for(int i = 0 ; i < arr.Length ; i++) {...}
JIT识别出这一点并删除边界检查(因为数组是固定大小的)。
答案 2 :(得分:1)
这看起来像是一种你不应该看的微优化。如果我没有弄错的话,这取决于CLR的架构和版本应用哪种优化。
如果你的方法被调用了很多,并且真的希望它内联,你可以自己内联它,代价是意大利面条代码。
我建议分析你的算法,内联方法不会保存速度,而更好的算法可以使你的运行时间从几小时减少到几秒。
答案 3 :(得分:-1)
JIT执行的最强大的优化通常是内联。 JIT甚至可以深入内联数百个函数(我听说过JikesRVM的这个数字)。它们甚至可以内联并不总是可以内联的内容,如果需要,可以在以后备份(称为动态去优化)。
对于您的具体问题,我可能会说,如果有问题的函数是 hot 。