我不知道该怎么问,只是想问一下。请帮我贴上标签。无论如何,我的朋友问我一个问题,在Java中哪个更快
int a = 5 + 5 + 5 + 5 + 5
或
int b = 5 * 5 ?
它依赖于语言吗?我的意思是,在java中,a
比b
快,但在C++中就差了
我的答案是a
比b
快,因为在计算机组织结构中比较加法/乘法
发布于 2011-01-21 18:47:31
它依赖于平台(和编译器)。如果你需要知道,那就去测量它。你不太可能处于需要知道的情况下。
但是,在您的两个示例中,这些都将在编译时进行计算(因此不需要运行时计算);例如,请参阅http://en.wikipedia.org/wiki/Constant_folding。
发布于 2011-01-21 18:52:41
在您的情况下,它不会改变任何事情。让我们编译一下:
public class Toto {
public static void main(String[] args) {
int a = 5 + 5 + 5 + 5 + 5;
int b = 5 * 5;
}
}
并检查反编译结果:
public class Toto
{
public static void main(String args[])
{
byte byte0 = 25;
byte byte1 = 25;
}
}
编译器做了内联所有的事情。
发布于 2011-01-21 18:50:43
两者都是常量表达式,因此它们将简化为
int a = 25;
int b = 25;
在编译时(100%确定,即使是玩具编译器也会这样做,因为这是最简单的优化之一)。
在远程情况下,这些操作不会被简化,假设有一个JIT以1:1的关系将乘法和加法操作码映射到它们的CPU指令对应物,在大多数现代体系结构中,所有整数算术操作通常需要相同数量的周期,因此乘一次将比加法四次更快(只要检查一下,加法仍然比乘法快:1个时钟对3个时钟,所以在这里使用乘法仍然是值得的)。
即使在超标量体系结构中,每个周期可以发出多条指令,加法操作链也具有数据依赖性,因此它们必须按顺序执行(并且由于加法指令只有1个周期,所以没有可能的流水线重叠,它仍然需要4个周期)。
在大多数中央处理器架构中,最优的指令序列可能是向左移动两个位置,然后添加原始值(5<<2+5
)。
https://stackoverflow.com/questions/4757848
复制相似问题