我想知道如何为资源非常有限的系统优化循环.比方说,如果我们有一个基本for循环,就像(写入javascript):
for(var i = someArr.length - 1; i > -1; i--)
{
someArr[i]
}
我老实说不知道,是不是!=比便宜>?
我将覆盖计算成本基础运营的背景下,像前述的任何资源感激>>,~,!,等等.
jal*_*alf 16
在现代CPU上的性能远非微不足道.以下是一些使其复杂化的事情:
所以简短的回答是"不要试图超越编译器".如果您能够在两个等效表达式之间进行选择,则编译器可能会执行相同的操作,并将选择最有效的表达式.根据所有上述因素,指令的成本会有所不同.执行哪些其他指令,CPU缓存中有哪些数据,运行代码的精确CPU模型等等.在一种情况下超高效的代码在其他情况下可能效率非常低.编译器将尝试选择最普遍有效的指令,并尽可能安排它们.除非你比编译器了解更多,否则你不太可能做得更好.
除非你真的知道自己在做什么,否则不要尝试这种微观优化.如上所示,低级性能是一个非常复杂的主题,并且很容易编写导致代码速度慢得多的 "优化" .或者只是牺牲对可以完全没有区别的东西的可读性.
此外,您的大多数代码根本不会对性能产生可测量的影响.人们通常喜欢在这个问题上引用(或错误引用)Knuth:
我们应该忘记小的效率,大约97%的时间说:过早的优化是所有邪恶的根源
人们经常将此解释为"不要试图优化代码".如果您确实阅读了完整的引用,一些更有趣的后果应该变得清晰:
大多数时候,我们应该忘记微观优化.大多数代码执行得很少,优化无关紧要.牢记的一个CPU能够每秒执行的指令数,很明显,一个代码块具有要执行非常经常用于优化在它有任何影响.因此,大约97%的时间,您的优化将浪费时间.但他也说有时(3%的时间),你的优化会很重要.显然,寻找那些3%有点像在大海捞针.如果您只是决定"优化代码",那么您将浪费时间在前97%.相反,您需要首先找到实际需要优化的3%.换句话说,通过分析器运行代码,让它告诉你哪个代码占用了最多的CPU时间.然后你知道在哪里优化.然后你的优化不再为时过早.
Mat*_*zol 10
除了最极端(实时嵌入式系统?)环境之外,这种微优化在任何情况下都会对您的代码产生显着差异的可能性极小.如果担心让代码可读和可维护,那么你的时间可能会更好.
如有疑问,请先问唐纳德克努特:
http://shreevatsa.wordpress.com/2008/05/16/premature-optimization-is-the-root-of-all-evil/
或者,对于微优化的略微不那么高的看法:
http://www.codinghorror.com/blog/archives/000185.html