我不知道怎么问,但是想问一下。请帮忙打标签。顺便说一下,我的朋友问了我一个问题,就是在Java中哪个更快。
int a = 5 + 5 + 5 + 5 + 5
或者
int b = 5 * 5 ?
这与语言有关吗?我的意思是,在Java中,a
比b
快,但在C中不是。
我的答案是a
比b
更快,因为涉及到计算机组织中的加法/乘法比较。
我不知道怎么问,但是想问一下。请帮忙打标签。顺便说一下,我的朋友问了我一个问题,就是在Java中哪个更快。
int a = 5 + 5 + 5 + 5 + 5
或者
int b = 5 * 5 ?
这与语言有关吗?我的意思是,在Java中,a
比b
快,但在C中不是。
我的答案是a
比b
更快,因为涉及到计算机组织中的加法/乘法比较。
这是平台(以及编译器)相关的。如果需要知道,请进行测量。很少有情况需要你必须知道。
然而,在您的两个示例中,它们将在编译时评估(因此不需要运行时计算)。请参见例如http://en.wikipedia.org/wiki/Constant_folding。
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;
}
}
编译器已经将所有内容都内联了。这两个都是常量表达式,因此它们将被简化为
int a = 25;
int b = 25;
在编译时(即使是玩具编译器也会这样做,因为这是最简单的优化之一),可以100%确定会进行这些操作的简化。
在极少数情况下,如果这些操作没有被简化,假设有一个JIT将乘法和加法操作码与它们的CPU指令对应起来,那么在大多数现代架构中,所有整数算术操作通常需要相同数量的周期,所以乘一次比加四次要快(刚刚检查过,加法仍然比乘法稍快:1个时钟周期与3个时钟周期,因此在这里使用乘法仍然更好)。
即使在超标量体系结构中,每个周期可以发出多个指令,加法操作的链仍然具有数据依赖性,因此它们必须按顺序执行(并且由于加法指令只需1个时钟周期,因此无法进行管道重叠,仍需要4个时钟周期)。
在大多数CPU架构中,最佳指令序列可能是将原始值左移两个位置,然后加上原始值(5<<2+5
)。
f1(n) = n * c
,相当于f2(n) = Sum[1->n] c
。O(1)
(常数时间,对于任何n
都只需要一次计算),加法的复杂度为O(n)
(线性时间,加法的次数等于n)。这完全取决于您使用的环境:
使用哪个编译器?如果是好的编译器,它会将其编译为常量。
程序代码的其余部分是什么?如果结果未被使用,则编译为NOP(无操作)。
运行在哪种硬件上?如果您有一个针对乘法而不是加法进行超级优化的处理器,理论上乘法可能比加法更快。
等等。
在大多数情况下,您不应该关心什么更快,大多数编译器比您聪明,并将为您进行优化。
如果您真的很在意,那么您可能不会在这里提问,但在这种情况下:进行基准测试。创建两个程序A和B,在典型的实际场景中同时使用它们,测量您感兴趣的时间/能量/其他参数,根据结果决定哪个程序更适合您的需求。
这取决于编译器,因为每个编译器都有不同的机制,有些使用左移操作,有些使用其他机制。
但在许多情况下,加法比乘法更快。