什么更快?System.currentTimeMillis()或Date().getTime()?

Igo*_*gor 5 java garbage-collection

什么是更快的方法?

System.currentTimeMillis() 
Run Code Online (Sandbox Code Playgroud)

要么

new Date().getTime()?
Run Code Online (Sandbox Code Playgroud)

知道经过的时间有更快的解决方案吗?

Pet*_*rey 10

如果你这样做

new Date()
Run Code Online (Sandbox Code Playgroud)

它叫

/**
 * Allocates a <code>Date</code> object and initializes it so that
 * it represents the time at which it was allocated, measured to the
 * nearest millisecond.
 *
 * @see     java.lang.System#currentTimeMillis()
 */
public Date() {
    this(System.currentTimeMillis());
}
Run Code Online (Sandbox Code Playgroud)

所以它调用System.currentTimeMillis()并创建一个立即丢弃的对象.

如果你很幸运,逃逸分析将删除冗余对象,性能将大致相同.

但是,我不认为Escape Analysis会启动并且只是打电话

long start = System.currentTimeMillis();
// do something
long time = System.currentTimeMillis() - start;
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 对象创建很快,即使它是多余的,Date对象也很小而且很便宜.但是它会导致a)系统中的对象数量和b)测试中的一般噪声(如果您尝试对其进行内存分析).为了减少变化(并加快代码速度),您希望减少内存分配,尤其是冗余分配.
  • 这只能精确到1毫秒,如果你的系统在运行时纠正时间,它可能是不正确的(甚至是负数)但是,它很少以戏剧性的方式做到这一点,而是逐渐纠正时钟意味着时间可能会出来一小部分.鉴于由于系统上发生的其他事情导致的时间变化,如果这是您最大的问题,那么您将非常幸运.
  • 可以使用System.nanoTime()代替,但这可能会有它自己的漂移.在较长的时间段内,例如小时,System.currentTimeMillis()可以更准确.
  • 如果您正在尝试编写微基准测试,我会确保代码预热.即忽略前2-10秒,因为在这个阶段代码很可能不热.