gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:14:31 27 4
gpt4 key购买 nike

我正在用 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 命令提示符中运行时,在清晰的提示符下(紧随 cls 命令之后),我会得到 ~700,000 ns,但当它必须滚动时,会得到 ~2,000,000 ns

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

您在评论中说您正在记录到文件控制台。这在开发中很好,但不要在生产中登录到控制台。你为什么要这么做?无论如何,生产代码应该在无人值守的情况下运行,并且没有人监视控制台,那么为什么要浪费时间在那里记录呢?

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

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

关于Java多线程应用程序System.out.println产生延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40668101/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com