JVM 会优化这个数学运算吗?

问题描述 投票:0回答:1

long time= (getTime()/60000L) * 60000L

getTime()
将返回以毫秒为单位的 Unix 时间。我正在利用长整除法来注销秒和毫秒。结果还必须采用 unix 时间格式(分辨率高达毫秒)

我想知道 JVM 是否会将上面的代码优化为

long time= getTime()

但这会改变结果。

或者有更好、更干净的方法吗? (不能改变getTime的返回类型,它也是long)

预先感谢您的帮助。

java jvm runtime
1个回答
0
投票

将评论总结为社区 Wiki 答案:

如果 JVM 按照您描述的方式“优化”该代码,这将是一个主要错误。故意使用截断除法和其他类似操作很常见,优化它们会破坏代码的语义。所以你现有的代码应该没问题。


您询问了其他方式。至少有几个。

您可以减去

% 60000L
的结果,而不是进行除法和乘法,尽管这仍然会在您需要用注释或类似内容进行解释的代码中留下一个“幻数”(
60000L
):

long time = getTime();
time = time - time % 60000L;

或者您可以使用

java.time.Instant
类使时间语义变得明显:

long time = Instant.ofEpochMilli(getTime())
    .truncatedTo(ChronoUnit.MINUTES)
    .toEpochMilli();

(如果您需要结果再次成为当前代码中的 Unix 毫秒时间值,则只需在末尾添加

.toEpochMilli()
;否则,它将是一个
Instant
实例)。

但是,虽然您可以执行其中任何一个(也可能执行其他操作),但如果您不想,则不必更改代码。

© www.soinside.com 2019 - 2024. All rights reserved.