首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基本操作cpu时间成本

基本操作cpu时间成本
EN

Stack Overflow用户
提问于 2009-08-18 20:02:59
回答 6查看 3.4K关注 0票数 7

我想知道,如何为资源非常有限的系统优化循环。比方说,如果我们有一个基本的for循环,比如(用javascript编写):

for(var i = someArr.length - 1; i > -1; i--) { someArr[i] }

我真的不知道,!=不是比>便宜吗?

我希望有任何资源用于支付基本运算符的计算成本,如前面提到的、>>~!等等。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-08-18 20:44:07

在现代CPU上的性能绝非微不足道。以下是几件让事情复杂化的事情:

  • 电脑速度很快。CPU每秒可以执行60亿条指令。因此,即使是最慢的指令也可以每秒执行数百万次,这意味着只有经常使用它,
  • 现代CPU的指令才能同时运行。它们是流水线的,这意味着当一条指令被读取时,另一条指令从寄存器读取,第三条指令正在执行,第四条指令被写回寄存器。现代CPU有15-20个这样的阶段。在此基础上,他们可以在每个阶段同时执行3-4条指令。他们可以重新排序这些指令。例如,如果乘法单元被另一个指令所使用,也许我们可以找到一个加法指令来代替执行。因此,即使混合了一些慢指令,它们的成本也可以很好地隐藏起来,方法是在等待慢指令完成时执行其他指令。
  • 内存比CPU慢数百倍。执行中的指令与从内存中检索数据相比,其成本是否相形见绌并不重要。即使这样也不可靠,因为CPU有自己的缓存试图隐藏这一成本。

因此,简单的回答是“不要试图超越编译器”。如果您能够在两个等效表达式之间进行选择,编译器可能也可以这样做,并且将选择最有效的表达式。根据上述所有因素,一项指令的成本各不相同。正在执行的其他指令,CPU缓存中的数据,运行的代码是哪个精确的CPU模型,等等。在一种情况下,超级高效的代码在另一种情况下可能非常低效。编译器将尝试选择最普遍有效的指令,并尽可能地对它们进行调度。除非您对此了解得比编译器多,否则您不太可能做得更好。

除非你真的知道你在做什么,否则不要尝试这样的微优化。正如上面所示,低级别的性能是一个非常复杂的问题,而且编写“优化”非常容易,从而导致代码的速度要慢得多。或者仅仅是牺牲可读性去做一些根本没有意义的事情。

此外,大多数代码对性能没有可衡量的影响。人们通常喜欢在这个问题上引用(或误用) Knuth:

我们应该忘记小效率,大约97%的时间说:过早的优化是万恶之源

人们通常将此理解为“不必费心地优化代码”。如果你真的读了完整的引语,一些更有趣的后果就会变得清晰起来:

大多数时候,我们应该忘记微优化。大多数代码很少被执行,所以优化并不重要。考虑到CPU每秒可以执行的指令数,很明显,必须经常执行代码块才能使其中的优化产生任何效果。因此,大约97%的时间,您的优化将是浪费时间。但他也说,有时候(3%的时间),你的优化很重要。显然,寻找这3%有点像在干草堆中寻找一根针。如果您只是决定“优化您的代码”在一般情况下,您将浪费您的时间在前97%。相反,您需要首先找到实际需要优化的3%。换句话说,通过分析器运行您的代码,让它告诉您哪些代码占用CPU时间最多。那你就知道该怎么优化了。然后,您的优化不再是过早的。

票数 16
EN

Stack Overflow用户

发布于 2009-08-18 20:21:17

这种微优化不太可能在任何最极端的(实时嵌入式系统?)中对您的代码产生显著的影响。环境。您的时间可能会得到更好的服务,担心代码的可读性和可维护性。

当有疑问时,一定要先问唐纳德·库思:

http://shreevatsa.wordpress.com/2008/05/16/premature-optimization-is-the-root-of-all-evil/

或者,对于稍微不那么高调的微观优化:

http://www.codinghorror.com/blog/archives/000185.html

票数 10
EN

Stack Overflow用户

发布于 2009-08-18 20:20:08

大多数比较都是相同的,因为处理器只是在所有方面对其进行比较,然后根据以前的比较产生的标志做出决定,所以比较信号根本不重要。但是,有些体系结构试图根据您正在比较的值来加速这个过程,比如比较0。

据我所知,按位运算是最便宜的操作,比加减略快。乘法和除法运算比较昂贵,而比较运算是最高的海岸运算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1296163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档