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

时间:2016-03-24 09:05:43

标签: java garbage-collection

什么是更快的方法?

System.currentTimeMillis() 

new Date().getTime()?

是否有更快的解决方案来了解已用时间?

1 个答案:

答案 0 :(得分:9)

如果你这样做

new Date()

它调用

/**
 * 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());
}

所以它调用System.currentTimeMillis()并创建一个你立刻扔掉的对象。

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

但是,我不会假设Escape Analysis会启动并只是调用

long start = System.currentTimeMillis();
// do something
long time = System.currentTimeMillis() - start;

注意:

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