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

时间:2016-11-18 01:46:35

标签: java multithreading console log4j latency

我正在用Java编写一个多线程应用程序,使用log4j进行日志记录。在我的基准测试期间,我发现每次输出日志时都会产生1或2 ms的延迟。经过调查,我发现问题只出现在控制台输出中,即使我摆脱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直接执行此操作吗?

提前感谢您的帮助...

1 个答案:

答案 0 :(得分:1)

我不得不将代码更改为nanos以查看结果。在Eclipse中运行我得到最终数~120,000 ns。在Windows命令提示符下运行我在清除提示符(在cls命令之后)获得~700,000 ns,但在必须滚动时获得~2,000,000 ns

写入控制台是同步,必须等待滚动和打印完成,因此不要登录到控制台,或只记录非常小的输出。

您在评论中说您正在登录文件控制台。这在开发中很好,但不能在生产中登录到控制台。你为什么这样?无论如何,生产代码应无人值守,并且没有人在监视控制台,所以为什么要浪费时间登录?

如果您暂时需要实时查看生产日志,请在日志文件中使用tail。对于Windows,请参阅" Looking for a windows equivalent of the unix tail command"。

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