我听说System.out.println();
Java语句代价高昂(耗费大量时间)
所以我试着评估它的成本:
当我评估5个陈述时...... The cost = 1.0
所以我预计1声明的成本= 0.2
但实际上我找到了The cost = 0.0
!!
double t1 = 0;
double t2 = 0;
t1 = System.currentTimeMillis();
System.out.println("aa");
System.out.println("aa");
System.out.println("aa");
System.out.println("aa");
System.out.println("aa");
t2 = System.currentTimeMillis();
System.out.println("The cost = " + (t2-t1) );
// The cost = 1.0
t1 = System.currentTimeMillis();
System.out.println("aa");
t2 = System.currentTimeMillis();
System.out.println("The cost = " + (t2-t1) );
// The cost = 0.0
// Expected : 1.0/5 = 0.2 -- But Actual : 0.0
为什么?
答案 0 :(得分:10)
System#currentTimeMillis
返回long
而不是double
。因此,你正在失去.2
。
测试5个语句并不是一个好主意,特别是当你几乎感觉不到执行它所需的时间时。我建议你测试超过5个语句,然后将数量减少到1以上。
你想要做一个精确的测量时间,最好使用System#nanoTime
,因为它在纳秒内提供时间:
long startTime = System.nanoTime();
// ... the code being measured ...
long estimatedTime = System.nanoTime() - startTime;
寻找“nanoTime vs currentTimeMillis”,您将获得数百篇文章。
答案 1 :(得分:3)
当我测试你的代码时,输出总是0.0。请使用System.nanoTime();
尝试您的基准
或者使用更多System.out.println()
double t1 = 0;
double t2 = 0;
t1 = System.currentTimeMillis();
for(int i = 0; i<1000; i++)
System.out.println("aa");
t2 = System.currentTimeMillis();
System.out.println("The cost = " + (t2-t1) );
t1 = System.currentTimeMillis();
for(int i = 0; i<100; i++)
System.out.println("aa");
t2 = System.currentTimeMillis();
System.out.println("The cost = " + (t2-t1) );
输出:62.0和5.0
这个1.2毫秒的差异是因为循环在运行时变得更快。
答案 2 :(得分:3)
如果执行时间小于1毫秒,您将看不到任何内容,因为时钟尚未“勾选”。对于这种类型的微基准测试,您应该使用类似的东西:
long t1 = System.nanoTime()
为您的时间测量。 (这以纳秒为单位测量时间,但并不总是具有那么多的粒度)
答案 3 :(得分:1)
此外,完成System.out.println的时间在功能强大的计算机上会有所不同,以及该计算机在该特定时刻执行其他任务的繁忙程度。