System.out.println()的消耗时间; Java声明?

时间:2013-12-19 13:45:56

标签: java debugging monitoring

我听说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

为什么?

4 个答案:

答案 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的时间在功能强大的计算机上会有所不同,以及该计算机在该特定时刻执行其他任务的繁忙程度。