写入到标准输出VS写入文件

问题描述:

这是类似的:写入到标准输出VS写入文件

Printing to the console vs writing to a file (speed)

我很困惑,因为有两个相互矛盾的答案。我写了一个简单的Java程序

for(int i=0; i<1000000; i++){ 
     System.out.println(i); 
} 

/usr/bin/time -v java test运行它来测量时间输出到标准输出,然后我试图/usr/bin/time -v java test > file/usr/bin/time -v java > /dev/null。写入控制台是最慢的(10秒),然后是文件(6秒),而/dev/null是最快的(2秒)。为什么?

+1

[因为'/ dev/null是网络比例](http://www.mongodb-is-web-scale.com/) – 2012-12-17 18:49:51

+0

尝试最小化控制台窗口 – irreputable

因为写入控制台需要在每次写入内容时刷新屏幕,这需要时间。

写入文件需要在磁盘上写入字节,这需要时间,但刷新屏幕的时间要少。

写入/dev/null不会在任何地方写任何东西,这会花费更少的时间。

+0

+1当你写很多数据到这些输出设备,它必须实际上对文本做些什么,并且您的程序必须等待它才能做到。即当程序产生的文本太快时,它*减慢消费者的速度。读取/写入的设备通常比您在Java中执行的操作更重要。 –

System.out.println的另一个问题是System.out默认情况下处于自动刷新模式,println实际上会关闭缓冲。试试这个

PrintWriter a = new PrintWriter(System.out, false); 
    for (int i = 0; i < 1000000; i++) { 
     a.println(i); 
    } 
    a.flush(); 

,你会看到,输出到文件变得快十倍。

+0

啊,我明白了。如果有一个标志在System.out上打开/关闭缓冲,会很方便。 –

+0

这就是使用日志API的原因之一。 –