如果要输出 15,000 行的消息,什么会使用更多内存?
System.out.println 会占用更多内存吗? 或者 System.setErr(new PrintStream(new FileOutputStream("tonsoflines.log"))) 会使用更多内存吗?
什么使用更多进程或需要更多内存才能运行?控制台窗口中的视觉输出或写入没有控制台视觉的文件?
编辑:还有谁先完成消息?
最佳答案
控制台
作为一些测试:打印到 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
新流
使用新的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)。
但如果你问我的想法,我会告诉你结果类似于我们刚刚执行的速度测试......对于我编写的任何应用程序中的日志,我使用 Log4J ( http://logging.apache.org/log4j/1.2/index.html ) 记录我想要的任何东西,你可以设置你想要的登录级别(调试、信息、错误等)
关于Java system.out 与新的 PrintStream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637887/