不同的运营商有不同的CPU使用量吗?

时间:2012-03-15 03:40:15

标签: performance operators cpu cpu-usage lag

我不知道如何输入谷歌,所以我在这里问这个。

在编程中,运营商会花费不同的时间或CPU使用量吗?例如:

x = y + z

花费的时间/ CPU少于:

x = y * z

我知道这根本不明显。只是一个奇怪的问题。

此外,如果您可以包含尽可能多的运算符,例如+ =, - =,* =和/ =以及所有普通运算符。

谢谢!

3 个答案:

答案 0 :(得分:3)

所有语言,数据类型,CPU等都没有主列表,因为可变性太大。

在某些语言中,运算符只是完全动态确定的类型调度函数调用的语法糖,因此“a + b”可能会成为一个需要几分钟的复杂函数调用,而“a * b”可能是一个简单的函数调用,需要几毫秒 - 反之亦然。

在具有固定编译时类型(包括C ++以及C,即使C ++有重载)的语言中,您可以在编译时确定将要调用的内容,这有助于减少很多内容,但仍然没有给你最后的答案。 (另见Dan D和Alex的答案。)

“扩充运算符”(+ =等等)通常只是扩展后赋值操作的简写。实际操作需要相同的时间。在具有动态类型分派的语言中,有时您也会切断一些辅助(非运算符)工作,因为扩充操作只需要查找变量的类型一次。使用静态(编译时)键入,只要编译器相当智能,简单的a += b类型操作永远不会在运行时保存a = a + b之外的任何内容,它们更容易阅读。更复杂的情况,例如p->q->r->s += t,实际上可以节省时间,因为(在棘手的情况下)如果重复写出p->q->r->s评估必须重复进行。

至于底层的CPU操作,有一些经验法则,但你必须拿出适当的CPU手册来看看哪些适用:

  • 对于整数,加法,减法和逻辑运算(如和/或/ xor)绝不会比任何其他操作慢任何
  • 对于整数,乘法比加法“更难”,即可能比加法等更慢,但只要有足够的CPU功率,它就可能仍然非常快;和除法可能比乘法慢,或者可能仍然很快
  • 对于浮点运算,加法和减法比乘法和除法“更难”,因此它们可能更慢(或者不是,再取决于FPU专用的晶体管空间有多少)
  • 如果没有FPU,浮点可能比整数
  • 如果存在桶或漏斗移位器,则移位总是快速的,但如果不是,移位可能需要更长时间,这取决于移位的“多远”(例如,x> 4可能比x>更慢)。 > 1)
  • 在现代CPU中,上面提到的指令调度@Alex可能或可能不依赖于指令的顺序,例如,它可能有助于在整数单元指令之间散布FPU指令(或者它可能没有)
  • 缓存效果(包括在缓存行中特定点附近放置分支以及多级缓存未命中以及TLB未命中)可以完全淹没对某些CPU进行仔细指令调度的影响

这些事情使得编写现代编译器优化器非常棘手。 : - )

答案 1 :(得分:1)

是的,在最低级别,有时a * b的费用超过a + b,有时则是另一种方式。这实际上取决于使用的硬件和使用的语言。

亲眼看看,运行几次测试,重复操作几千次。

答案 2 :(得分:1)

您需要查看CPU手册,看看有哪些逻辑和算术指令以及它们执行的周期数。

如果没有整数除法或乘法的指令,则编程语言必须使用更原始的(例如移位和加法/减法)来构造这些操作。这同样适用于对长整数的简单操作,例如加法,减法,比较,移位和/或xor,按位反转。如果没有使用长整数执行这些操作的指令,则必须使用较短的整数来构造它们,这意味着操作员的性能将取决于所涉及类型的大小。

某些CPU没有浮点运算指令,这意味着所有浮点运算都需要使用整数运算指令来构造,因此它们比整数上的类似运算要慢。

要考虑的另一件事是,所讨论的指令是否可以与CPU中的其他指令配对(如果可以配对(并行执行))。如果他们不能配对,他们将减慢附近的配对指令。某些CPU具有多个ALU,用于可以同时执行的简单指令。除了简单的配对外,一些复杂的指令可能会使用CPU流水线的更多阶段,或者使用与简单指令不同的指令,这可能会延迟执行其他简单指令。

最终答案取决于您的CPU和编程语言/编译器/解释器。