我不知道如何输入谷歌,所以我在这里问这个。
在编程中,运营商会花费不同的时间或CPU使用量吗?例如:
x = y + z
花费的时间/ CPU少于:
x = y * z
我知道这根本不明显。只是一个奇怪的问题。
此外,如果您可以包含尽可能多的运算符,例如+ =, - =,* =和/ =以及所有普通运算符。
谢谢!
答案 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手册来看看哪些适用:
这些事情使得编写现代编译器优化器非常棘手。 : - )
答案 1 :(得分:1)
是的,在最低级别,有时a * b
的费用超过a + b
,有时则是另一种方式。这实际上取决于使用的硬件和使用的语言。
亲眼看看,运行几次测试,重复操作几千次。
答案 2 :(得分:1)
您需要查看CPU手册,看看有哪些逻辑和算术指令以及它们执行的周期数。
如果没有整数除法或乘法的指令,则编程语言必须使用更原始的(例如移位和加法/减法)来构造这些操作。这同样适用于对长整数的简单操作,例如加法,减法,比较,移位和/或xor,按位反转。如果没有使用长整数执行这些操作的指令,则必须使用较短的整数来构造它们,这意味着操作员的性能将取决于所涉及类型的大小。
某些CPU没有浮点运算指令,这意味着所有浮点运算都需要使用整数运算指令来构造,因此它们比整数上的类似运算要慢。
要考虑的另一件事是,所讨论的指令是否可以与CPU中的其他指令配对(如果可以配对(并行执行))。如果他们不能配对,他们将减慢附近的配对指令。某些CPU具有多个ALU,用于可以同时执行的简单指令。除了简单的配对外,一些复杂的指令可能会使用CPU流水线的更多阶段,或者使用与简单指令不同的指令,这可能会延迟执行其他简单指令。
最终答案取决于您的CPU和编程语言/编译器/解释器。