添加日志输出后,Java 应用程序速度会提高

2022-09-03 06:47:02

我们偶然发现了一个相当奇怪的问题IMO。我们的客户一直在抱怨我们的应用程序从文件导入和处理数据的速度 [文件大小1kB cca,正常情况下导入文件所需的时间为4-10秒,具体取决于整体工作负载。是的,这是很多]...

因此,我们开始研究它,但发生了一些非常意想不到的事情:在将调试日志输出插入代码的某些部分(否则不会影响逻辑)之后,导入速度加快了很多:300ms-2200ms /file取决于整体工作负载。

使用语言: Java

JDK 6_34 在我的工作站上 [ 不知道我的同事使用什么版本 ]

我已经浏览了代码...很多次。没什么不寻常的。即使它都是在线程中执行的,这个线程也没有竞争对手做同样的工作或访问相同的文件。

这种情况对任何人都熟悉吗?

P.S.:我确实希望这个问题确实属于这里。如果没有,我真诚地道歉。

编辑:

至于日志记录,我们使用log4j。

操作系统:Windows XP / my machine。一个同事有相同的,另一个使用Win7 /

中央处理器: E7500 @ 2.93 千兆赫

内存: 2 GB DDR2

另一台机器基本上是一样的。我不知道第三个的配置,因为它是新的,而不是我的工作站。

在我的情况下,文件都是从/存储到本地HDD的。

我最担心的是,我们使用的是一个我们没有来源的平台,因为,我们已经支付了许可证,但没有支付来源>.<


答案 1

我的理论是,添加日志记录会改变应用程序的线程调度模式中的某些内容。

通常,这应该无关紧要。但是,如果应用程序中的潜在问题是与线程调度相关的问题,那么日志记录更改观察到的行为也就不足为奇了。

我建议您审核代码库的相关部分,查找调用、调用、代码轮询的位置等。还要考虑到这可能发生在第三方库代码中。Thread.sleep(...)Thread.yield()

@OldCurmudgeon的答案包括您应该寻找的两个简单版本。即使使用也是浪费,尽管它比明显大于零的地方更好。sleep(0)sleep(N)N


答案 2

您是否能够在您正在使用的计算机上重现客户的原始问题(即,您是否能够拉取文件并按照您提到的要求它们花费4-10秒)?

如果不是,那么涉及的因素太多了,无法明确给予log4j信用。我和威尔夫在一起。添加日志无法可靠地提高一段代码的速度...至少我想不出什么办法。

如果您能够重现问题,然后添加日志,然后使用相同的硬件,相同的逻辑和相同的文件获得如此多的速度提升,那么您已经正式炸毁了我的思想。


推荐