System.currentTimeMillis()和Date getTime()有什么区别?

14

我希望能从多次调用一个返回时间戳的函数中获得微小的性能提升。该函数如下:

public static long get_now_ms(){
    // returns number of MILLISECONDS since epoch
    java.util.Date d = new java.util.Date();
    return d.getTime();
}

我能否仅用这个替换:

public static long get_now_ms(){
    // returns number of MILLISECONDS since epoch
    return System.currentTimeMillis();
}

我知道Date内部使用System.currentTimeMillis()。我的问题更多的是夏令时或时区是否会导致这两种方法的结果不同。我想这可能在Calendar对象中出现,但不会在Date对象中出现,但是我希望能够澄清一下。

我知道在实际应用中可能看不到明显的性能差异,但还是想知道答案。

谢谢!

3个回答

14

没有区别,除了分配一个 Date 对象会导致非常轻微的延迟。

javadoc 中可以看到 Date 的默认构造函数:

分配一个 Date 对象并将其初始化,以表示分配时间,精确到最近的毫秒。

Date 只是对于时代毫秒数进行的简单包装,没有任何时区概念。只有当被渲染为字符串时才考虑时区,但这由 Locale 类处理。


5

我建议运行单元测试(例如https://gist.github.com/ledlogic/8532028)。 我发现使用System.currentTimeMillis比使用(new Date()).getTime()只有轻微的整体效益。

1 billion runs: (1000 outer loops, 1,000,000 inner loops):
    System.currentTimeMillis(): 14.353 seconds
    (new Date()).getTime(): 16.668 seconds

个别运行可能会稍微偏向于后一种方法 - 这取决于您的系统活动情况。


2

没有区别,Calendar.getTimeInMillis()也是一样的。因为返回结果是自1970年1月1日00:00:00 GMT以来的毫秒数。无论你身在何处,你都会得到相同的长整型值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接