哪一个更快5 + 5 + 5 + 5 + 5或5*5?

3 java language-agnostic math optimization performance

我不知道怎么问,但只是想问.请帮我标记一下.无论如何,我的朋友问我一个问题,即哪个更快的Java

int a = 5 + 5 + 5 + 5 + 5
Run Code Online (Sandbox Code Playgroud)

要么

int b = 5 * 5 ?
Run Code Online (Sandbox Code Playgroud)

它是语言依赖的吗?我的意思是,abjava 快,但不是C

我的答案ab计算机组织中的加法/乘法的比较更快

Oli*_*rth 14

它依赖于平台(和编译器).如果您需要了解,请进行测量.你不太可能遇到需要知道的情况.

但是,在两个示例中,这些都将在编译时进行评估(因此不需要运行时计算); 参见例如http://en.wikipedia.org/wiki/Constant_folding.


gab*_*uzo 13

在你的情况下是不会改变任何东西.我们编译:

public class Toto {
    public static void main(String[] args) {
        int a = 5 + 5 + 5 + 5 + 5;
        int b = 5 * 5;
    }
}
Run Code Online (Sandbox Code Playgroud)

并检查反编译结果:

public class Toto
{
    public static void main(String args[])
    {
        byte byte0 = 25;
        byte byte1 = 25;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译器确实内联了所有内容.


for*_*ran 6

两者都是常量表达式,因此它们将被简化为

int a = 25;
int b = 25;
Run Code Online (Sandbox Code Playgroud)

在编译时(100%肯定,甚至玩具编译器都这样做,因为这是最简单的优化之一).

在远程情况下,这些操作不会简化,假设有一个JIT映射乘法并以1:1的关系将操作码添加到它们的CPU指令对应物,在大多数现代架构中,所有整数算术运算通常需要相同的循环次数,所以它会比加四次更快一次乘法(只需检查一下,加法仍然比乘法稍快:1个时钟对3个时钟,所以它仍然需要在这里使用乘法).

即使在超标量体系结构中,每个周期可以发出多个指令,添加操作链也具有数据依赖性,因此它们必须按顺序执行(并且因为add指令只有1个周期,所以不可能管道重叠,仍然需要4个周期).

在大多数CPU架构中,最佳指令序列可能是向左移动两个位置,然后添加原始值(5<<2+5).

  • 幸运的是,现实并不关心你喜欢与否. (8认同)