Java 多线程应用程序 System.out.println 产生延迟

Java multithreaded application System.out.println generate latency

我正在 Java 中编写多线程应用程序,使用 log4j 进行日志记录。在我的基准测试中,我发现每次输出日志时,都会产生 1 或 2 毫秒的延迟。经过排查,我发现问题只出现在控制台输出中,即使我去掉 log4j 直接使用 System.out.print 打印也会出现问题。在该线程中,我使用了以下测试:

        System.out.println("===============================================================");
        long ts = java.lang.System.currentTimeMillis();
        String toPrint = "### TEST 1 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n";
        toPrint = toPrint + "### TEST 2 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n";
        toPrint = toPrint + "### TEST 3 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n";
        toPrint = toPrint + "### TEST 4 " + (java.lang.System.currentTimeMillis() - ts) + " ms \n";
        System.out.print(toPrint);
        System.out.println("===============================================================");

        System.out.println("### TEST 1 " + (java.lang.System.currentTimeMillis() - ts) + " ms");
        System.out.println("### TEST 2 " + (java.lang.System.currentTimeMillis() - ts) + " ms");
        System.out.println("### TEST 3 " + (java.lang.System.currentTimeMillis() - ts) + " ms");
        System.out.println("### TEST 4 " + (java.lang.System.currentTimeMillis() - ts) + " ms");
        System.out.println("===============================================================");

输出为:

===============================================================
### TEST 1 0 ms
### TEST 2 0 ms
### TEST 3 0 ms
### TEST 4 0 ms
===============================================================
### TEST 1 7 ms
### TEST 2 9 ms
### TEST 3 10 ms
### TEST 4 11 ms
=============================================================== 

多线程应用程序在不产生延迟的情况下直接输出到控制台的正确方法是什么?

我们可以设置 log4j 来直接执行此操作吗?

在此先感谢您的帮助...

我必须将代码更改为 nanos 才能看到结果。 运行 在 Eclipse 中我得到了 ~120,000 ns 的最终数字。 运行 在 Windows 命令提示符下我得到 ~700,000 ns 一个清晰的提示(在 cls 命令之后),但是当它必须滚动时 ~2,000,000 ns

写入控制台是同步,并且必须等待滚动和打印完成,所以不要记录到控制台,或者只记录非常少的输出。

您在评论中说您正在记录到文件 控制台。这在开发 中很好,但不要在生产 中登录到控制台。你为什么会?无论如何,生产代码应该 运行 无人看管,也没有人在看控制台,所以为什么要浪费时间在那里登录?

如果您临时需要实时观看生产日志,请对日志文件使用tail。对于 Windows,请参阅“Looking for a windows equivalent of the unix tail command”。

如果您坚持要登录到控制台,请尝试使用 AsyncAppender