在Java中禁用System.out以获得速度

g.r*_*ket 14 java system.out

我正在用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

你应该使用像log4jslf4j这样的真实日志框架.在任何一种情况下,您都可以设置日志记录级别,以限制转储到日志中的信息级别.

如果你坚持使用System.out,你可以将你的日志语句包装在一个条件中,比如

if (DEBUG) {
  System.out.println(...);
}
Run Code Online (Sandbox Code Playgroud)

是的,大量日志记录或打印到System.out将影响性能.


TWi*_*Rob 6

我同意其他人的观点,即应该使用适当的记录器。然而,这并非在所有情况下都是可能的。以下代码禁用并按照 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)

我的样品测量是:

  • 82ms 满载输出
  • 当只覆盖57mswrite(int)OutputStream
  • 覆盖PrintStream方法时也为31 毫秒
  • 5ms 注释掉所有printlnprintf用法

因此,它比此处的其他答案更快,但无法击败不存在的代码(注释掉System.outs 或换行if (DEBUG)),因为 varargs 分配数组和框基元或StringBuilder+也)仍然执行。