【问题标题】:Consumed Time of System.out.println(); Java statement?System.out.println()的消耗时间; Java 声明?
【发布时间】:2013-12-19 13:45:56
【问题描述】:

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

为什么?

【问题讨论】:

  • 您应该将基准测试中的调用次数增加到循环中的 5000 次。 那么你可能会得到更好的输出!
  • 问题出在您的代码中,而不是在system.out.println中。
  • 你知道即使是一毫秒的成本也太高了,因为普通的 cpu 可以在那段时间内处理几百万条指令?

标签: java debugging monitoring


【解决方案1】:

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”,您将获得数百篇文章。

【讨论】:

  • 您是否也想了解currentTimeMillisnanoTime 之间的区别?然后我可以跳过自己尝试回答另一个无效的基准测试问题:)
【解决方案2】:

如果执行时间少于一毫秒,您将什么也看不到,因为时钟还没有“滴答”。对于这种类型的微基准测试,您应该使用类似:

long t1 = System.nanoTime()

用于您的时间测量。 (这以纳秒为单位测量时间,尽管并不总是以那么大的粒度)

【讨论】:

    【解决方案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 毫秒的差异是因为循环在运行时变得更快。

    【讨论】:

      【解决方案4】:

      此外,在功能或多或少的计算机上,完成 System.out.println 的时间会有所不同,以及该计算机在特定时刻执行其他任务的繁忙程度。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多