[英]Difference between System.currentTimeMillis() and Date getTime()?
[英]Big difference on System.currentTimeMillis()
我正在使用这段代码来测试哪种方法更快:
public void test() {
long start = System.currentTimeMillis();
MyDate date = new MyDate();
int max = 5000;
for (int i = 0; i < max; i++) {
Calendar.getInstance().getTimeInMillis(); // <--
}
System.out.println("Calendar instance delay: " + (System.currentTimeMillis() - start));
start = System.currentTimeMillis();
for (int i = 0; i < max; i++) {
date.getMillis(); // <--
}
System.out.println("My date delay: " + (System.currentTimeMillis() - start));
}
因此,基本上,我正在尝试比较Calendar.getInstance().getTimeInMillis()
和MyDate.getMillis()
之间的性能(MyDate是我创建的类)。
好吧,当我运行上面的代码时,输出为:
Calendar instance delay: 413
My date delay: 2
但是 ,当我颠倒顺序时(首先叫MyDate,然后在Calendar之后),我得到了:
My date delay: 247
Calendar instance delay: 119
我尝试使用System.nanoTime()
,但是发生了相同的事情:要测试的第一个代码是花费了更长时间的代码。
有人知道为什么会发生这种差异吗? 或者,是否有一种方法可以在不使用外部探查器应用程序(仅是纯Java代码)的情况下准确地探查代码?
谢谢。
要测试“小”代码的性能,您必须多次调用它。 否则,JIT,缓存和分支预测的效果会影响您的测试。 如果我打电话给您看您接听电话需要多长时间,那么如果我几秒钟前才打电话给您,我会得到一个截然不同的答案。
Common lang中有一个StopWatch类,它使用System.nanoTime,
http://commons.apache.org/lang/
org.apache.commons.lang.time.StopWatch
在评估性能时,请记住,作为优化的一部分,JVM可能会消除没有副作用的代码。
为避免这种情况,您可以执行以下操作:
for (int i = 0; i < max; i++) {
long a = date.getMillis();
if (a % 1000 == i) {
System.out.print(a);
}
}
要注意的另一件事是热点优化。 在测量之前,您应该“热身”代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.