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)
它是语言依赖的吗?我的意思是,a比bjava 快,但不是C
我的答案a比b计算机组织中的加法/乘法的比较更快
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)
编译器确实内联了所有内容.
两者都是常量表达式,因此它们将被简化为
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).