如果要输出15,000行的消息会占用多少内存?
System.out.print会让我们更多的记忆吗? 或者System.setErr(new PrintStream(new FileOutputStream(“tonsoflines.log”)))会使用更多内存吗?
什么使用更多进程或需要更多内存才能运行?控制台窗口中的视觉输出或写入没有控制台可视化的文件?
编辑:还有哪一个会先完成消息?
答案 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
238ms
235ms
251ms
210ms
172ms
268ms
使用新的Stream
结果是:
Printing line : #0
.
.
.
Printing line : #14996
Printing line : #14997
Printing line : #14998
Printing line : #14999
System.out with new stream took: 220ms
220ms
219ms
222ms
220ms
223ms
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)。
但是如果你问我的想法,我会说结果将类似于我们刚刚执行的速度测试...对于我在任何应用程序中的日志我编码,我使用Log4J( http://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。