【发布时间】:2015-07-12 06:37:33
【问题描述】:
我想做以下事情
int sum = x+y;
sum = Math.max(sum,x);
但是那行代码往往比
花费更长的时间int sum = x+y;
if(x>sum)sum=x;
我希望这不是不恰当的问题,但是有人可以解释为什么会这样吗?
我已经查看了源代码,Java 所做的只是
return (a >= b) ? a : b;
【问题讨论】:
我想做以下事情
int sum = x+y;
sum = Math.max(sum,x);
但是那行代码往往比
花费更长的时间int sum = x+y;
if(x>sum)sum=x;
我希望这不是不恰当的问题,但是有人可以解释为什么会这样吗?
我已经查看了源代码,Java 所做的只是
return (a >= b) ? a : b;
【问题讨论】:
可能是因为 Java 的 Math 类是第一次像任何其他 Singleton 或类似的东西一样被创建,因为在此之前没有人使用它,比如类加载器操作。
【讨论】:
Math.max 是否“慢”?
方法调用不是免费的(即使忽略 Roey 指出的潜在类负载):它们涉及将参数和返回地址压入堆栈,跳转到代码中的不同位置,将参数从堆栈中弹出,完成工作,将结果压入堆栈,跳回并将结果从堆栈中弹出。
然而,我怀疑你会发现,如果你在代码中的热点(一个运行了 LOT 的地方)中有一个 Math.max 调用, Oracle 的 JVM 的 JIT 会将其优化为内联操作以加快速度。如果似乎没有任何需要,它不会打扰,更喜欢字节码的编译速度而不是机器码而不是优化;但它是一个两阶段编译器,其中第二阶段开始更积极地优化它在代码中检测到的热点。
【讨论】: