我正在用java编写一个模拟重力的程序,在其中我有一堆日志语句(到System.out).我的程序运行速度很慢,我认为日志记录可能是其中一部分原因.有没有办法禁用System.out,以便我的程序在打印时不会变慢,或者我是否必须手动浏览并注释/取消注释每个程序以启用/禁用调试语句?任何帮助,将不胜感激.
Hov*_*els 17
输出流gobbler再次可以工作,也许像......
System.setOut(new PrintStream(new OutputStream() {
@Override
public void write(int arg0) throws IOException {
}
}));
Run Code Online (Sandbox Code Playgroud)
但更好的解决方案是使用已经提到的正式日志记录实用程序.
Jef*_*man 12
你应该使用像log4j或slf4j这样的真实日志框架.在任何一种情况下,您都可以设置日志记录级别,以限制转储到日志中的信息级别.
如果你坚持使用System.out,你可以将你的日志语句包装在一个条件中,比如
if (DEBUG) {
System.out.println(...);
}
Run Code Online (Sandbox Code Playgroud)
是的,大量日志记录或打印到System.out将影响性能.
我同意其他人的观点,即应该使用适当的记录器。然而,这并非在所有情况下都是可能的。以下代码禁用并按照 OP 的要求快速运行:
System.setOut(new java.io.PrintStream(new java.io.OutputStream() {
@Override public void write(int b) {}
}) {
@Override public void flush() {}
@Override public void close() {}
@Override public void write(int b) {}
@Override public void write(byte[] b) {}
@Override public void write(byte[] buf, int off, int len) {}
@Override public void print(boolean b) {}
@Override public void print(char c) {}
@Override public void print(int i) {}
@Override public void print(long l) {}
@Override public void print(float f) {}
@Override public void print(double d) {}
@Override public void print(char[] s) {}
@Override public void print(String s) {}
@Override public void print(Object obj) {}
@Override public void println() {}
@Override public void println(boolean x) {}
@Override public void println(char x) {}
@Override public void println(int x) {}
@Override public void println(long x) {}
@Override public void println(float x) {}
@Override public void println(double x) {}
@Override public void println(char[] x) {}
@Override public void println(String x) {}
@Override public void println(Object x) {}
@Override public java.io.PrintStream printf(String format, Object... args) { return this; }
@Override public java.io.PrintStream printf(java.util.Locale l, String format, Object... args) { return this; }
@Override public java.io.PrintStream format(String format, Object... args) { return this; }
@Override public java.io.PrintStream format(java.util.Locale l, String format, Object... args) { return this; }
@Override public java.io.PrintStream append(CharSequence csq) { return this; }
@Override public java.io.PrintStream append(CharSequence csq, int start, int end) { return this; }
@Override public java.io.PrintStream append(char c) { return this; }
});
Run Code Online (Sandbox Code Playgroud)
我的样品测量是:
write(int)的OutputStreamPrintStream方法时也为31 毫秒println和printf用法因此,它比此处的其他答案更快,但无法击败不存在的代码(注释掉System.outs 或换行if (DEBUG)),因为 varargs 分配数组和框基元或StringBuilder(+也)仍然执行。