Java 哪一个更快5+;5+;5+;5+;5还是5*5?

Java 哪一个更快5+;5+;5+;5+;5还是5*5?,java,performance,language-agnostic,optimization,math,Java,Performance,Language Agnostic,Optimization,Math,我不知道怎么问,只是想问。请帮我贴上标签。无论如何,我的朋友问了我一个问题,哪一个在Java中更快 int a = 5 + 5 + 5 + 5 + 5 或 它依赖于语言吗?我的意思是,a在java中比b快,但在C中不是 我的答案是a比b快,因为在计算机组织中比较加法/乘法它依赖于平台(和编译器)。如果你需要知道,那就测量一下。你不太可能处于需要知道的情况 但是,在这两个示例中,这些都将在编译时进行计算(因此不需要运行时计算);请参见,例如..这两个表达式都是常量表达式,因此它们将简化为 int

我不知道怎么问,只是想问。请帮我贴上标签。无论如何,我的朋友问了我一个问题,哪一个在Java中更快

int a = 5 + 5 + 5 + 5 + 5

它依赖于语言吗?我的意思是,
a
在java中比
b
快,但在C中不是

我的答案是
a
b
快,因为在计算机组织中比较加法/乘法

它依赖于平台(和编译器)。如果你需要知道,那就测量一下。你不太可能处于需要知道的情况


但是,在这两个示例中,这些都将在编译时进行计算(因此不需要运行时计算);请参见,例如..

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

int a = 25;
int b = 25;
在编译时(100%确定,甚至玩具编译器也会这样做,因为这是最简单的优化之一)

在远程情况下,这些操作不会简化,假设存在一个JIT,它将乘法和加法操作码以1:1的关系映射到它们的CPU指令对应项,在大多数现代体系结构中,所有整数算术运算通常采用相同的周期数,因此,一次乘法要比四次加法快(刚刚检查过,加法仍然比乘法快一点:1个时钟对3个时钟,所以这里仍然使用乘法支付)

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


在大多数CPU体系结构中,最佳指令序列可能是向左移动两个位置,然后添加原始值(
5),这取决于编译器,因为每个编译器对此有不同的机制—有些使用左移操作,有些使用另一种机制


但在许多情况下,加法比乘法快。

在您的情况下,is不会改变任何东西。让我们编译:

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;
    }
}

编译器内联了所有的东西。

我想加法比乘法快,因为(据我所知)所有乘法都被视为加法

添加:


阅读一些解释我们应该比较时间复杂度。函数是
f1(n)=n*c
,等价的
f2(n)=Sum[1->n]c


乘法的复杂度为
O(1)
(恒定时间,任何
n
计算一次),加法的复杂度为
O(n)
(线性时间,加法数等于n)。

这一切都取决于您使用的环境:

  • 哪个编译器?它是一个好的编译器,然后它将它编译成常量

  • 剩下的程序代码是什么?如果没有使用结果,它将编译为NOP(无操作)

  • 它运行在哪种硬件上?如果您有一个针对乘法而不是加法进行超级优化的处理器,乘法(理论上)可能会比加法运算快

  • 等等

在大多数情况下,您不应该关心什么是更快的,大多数编译器都比您更智能,并且会为您进行优化


如果你真的关心它,你可能不会在这里问这个问题,但在这种情况下:基准测试它。创建两个程序A和B,在典型的现实场景中使用它们,测量时间/能量/你感兴趣的任何参数,根据结果决定哪个程序更适合你的需要。

这里至少有两个问题:底层操作的性能,以及编译器做什么(事实上,Java到字节码编译器和JIT编译器都做什么)

第一,“原始”的问题运算。作为一般规则,加法、减法和乘法在大量处理器上所用的时间大致相同。您可能会想象乘法速度要慢得多,但事实证明并非如此。例如,看看各种处理器上的情况。乘法的速度稍微“慢”一点总的来说,它有一个更高的延迟。这实际上意味着,如果处理器只对不同的数据段执行一系列乘法运算,它将比对不同的数据段执行一系列加法运算略慢。但前提是周围有其他指令可以在“乘法结束时”执行,则加法和乘法之间的总体差别不大

不久前,我还列出了32位奔腾上的时钟(这些数字最初来自英特尔的处理器手册,我记得我做过实验测试,在实践中,这些都是计时)请注意,有一种非常相似的模式:加法、减法和乘法基本上彼此占用相同的时间;除法的速度明显较慢

然后,如果你看一下我刚才提到的那张表,你会发现2次方的除法更快,因为JIT编译器可以将它们转换成乘法。2次方可以用浮点表示法精确表示,因此,如果你用1次方的乘法代替x的除法,就不会损失精度/其中x是2的幂

或者换句话说,Java编译器和JIT编译器都可以应用各种优化,这意味着给定代码段的底层指令不一定是您所认为的。正如其他人所提到的,一个非常基本的优化是预计算值,因此如果您编写“5+5+5+5+5”,实际上,Java编译器应该将其替换为“25”
public class Toto
{
    public static void main(String args[])
    {
        byte byte0 = 25;
        byte byte1 = 25;
    }
}