2016-04-25 104 views
4

我已经从我的Java编程书中得到了一个简单的程序,只是添加了一点。System.out.print导致延迟?

package personal; 

public class SpeedTest { 
    public static void main(String[] args) { 
    double DELAY = 5000; 
    long startTime = System.currentTimeMillis(); 
    long endTime = (long)(startTime + DELAY); 
    long index = 0; 

    while (true) { 
     double x = Math.sqrt(index); 
     long now = System.currentTimeMillis(); 
     if (now >= endTime) { 
     break; 
     } 
     index++; 
    } 
    System.out.println(index + " loops in " + (DELAY/1000) + " seconds."); 
    } 
} 

这将返回128478180 loops in 5.0 seconds.

如果我的if语句前加上System.out.println(x);,然后我在5秒内循环次数下降到400,000,是由于System.out.println()延迟?还是只是x没有被计算,当我不打印出来?

+8

打印到控制台必须是最差的事情,你可以做性能明智的。 IO操作需要很长时间。 – Tunaki

+0

System.out.println是一个IO操作,是的,它可以影响任何程序的性能 – Sanjeev

+6

好的问题,我不明白downvotes。仅仅因为这对你来说是微不足道的,并不意味着你应该倒下。 – Maroun

回答

0

每当一个非常繁忙的环路内你“做输出”,在任何编程语言无论如何,你介绍两种可能,极显著延迟:

  1. 必须将数据转换为可打印字符,然后写入它可能要去的任何显示器/设备......并且...
  2. “输出任何东西的动作”强制进程​​使其与任何其他进程同步正在产生输出。

通常用于此目的的一种替代策略是“跟踪表”。这是一个内存数组,一些固定大小的包含字符串的。条目以“循环”方式添加到此表中:最旧的条目不断被最新条目取代。该策略提供历史而不需要输出。(剩下的唯一要求是,任何人都被添加到表中的条目,或从中读取,必须使用一个互斥同步他们的活动例如。)

进程希望通过显示的内容trace-table应该抓住互斥锁,制作感兴趣内容的内存中副本,然后在准备输出之前释放互斥锁。通过这种方式,对跟踪表贡献条目的各种过程不会因与I/O相关的延迟源而延迟。

相关问题