Java system.out与新的PrintStream

时间:2010-09-03 16:56:22

标签: java logging process performance

如果要输出15,000行的消息会占用多少内存?

System.out.print会让我们更多的记忆吗? 或者System.setErr(new PrintStream(new FileOutputStream(“tonsoflines.log”)))会使用更多内存吗?

什么使用更多进程或需要更多内存才能运行?控制台窗口中的视觉输出或写入没有控制台可视化的文件?

编辑:还有哪一个会先完成消息?

3 个答案:

答案 0 :(得分:2)

我认为在内存方面差异很小,可能对System.out.println来说略有优势 在处理和速度方面,写入日志文件将比在屏幕上打印所有内容快得多。 Java的大多数日志框架都经过优化,可以在日志记录操作期间获得最佳性能,因此您肯定希望使用一个良好的日志框架,例如Log4J。

答案 1 :(得分:2)

控制台

作为一些测试:打印到System.out的结果是:

Printing line : #0
.
.
.
Printing line : #14997
Printing line : #14998
Printing line : #14999
System.out took: 238ms
  • 测试#1:238ms
  • 测试#2:235ms
  • 测试#3:251ms
  • 测试#4:210ms
  • 测试#5:172ms
  • 测试#6:268ms

new Stream

使用新的Stream结果是:

Printing line : #0
.
.
.
Printing line : #14996
Printing line : #14997
Printing line : #14998
Printing line : #14999
System.out with new stream took: 220ms
  • 测试#1:220ms
  • 测试#2:219ms
  • 测试#3:222ms
  • 测试#4:220ms
  • 测试#5:223ms
  • 测试#6:250ms

代码

    try {

        System.setOut(new PrintStream(new FileOutputStream("C:\\TMP\\logs.log")));
                    long startTime = Calendar.getInstance().getTimeInMillis();
        for (int a=0;a<15000;a++) {
            System.out.println("Printing line : #"+a);
        }

        long elapsedTime = (Calendar.getInstance().getTimeInMillis() - startTime);
        System.out.println("System.out took: " + elapsedTime + "ms");
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }

正如您所看到的速度差异甚至不是“交易”,我没有检查的是使用这些方法的性能(磁盘I / O,内存和CPU)。

但是如果你问我的想法,我会说结果将类似于我们刚刚执行的速度测试...对于我在任何应用程序中的日志我编码,我使用Log4Jhttp://logging.apache.org/log4j/1.2/index.html)记录我想要的任何内容,你可以设置你想要的loggin级别(调试,信息,错误等)

答案 2 :(得分:0)

System.out是PrintStream的对象。所以我认为不会有太大差异。

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/System.html#out

  

public static final PrintStream out

     

“标准”输出流。这个   流已经打开并准备好了   接受输出数据。通常这个   stream对应于显示输出   或另一个输出目的地   由主机环境指定或   用户。

如果您正在考虑将其用于日志记录,则建议使用专门的日志框架,例如Log4J