我们偶然发现了一个相当奇怪的问题。我们的客户一直在抱怨我们的应用程序从文件导入和处理数据的速度太快,文件大小为1kB cca,正常情况下导入文件所需的时间为4-10秒,具体取决于整体工作负载。是的,确实很多……
因此,我们开始研究它,但发生了一些非常意想不到的事情:在将调试日志输出插入到代码的某些部分后,不影响逻辑,否则导入速度会加快很多:根据总体工作负载的不同,/file为300ms-2200ms。
使用的语言: Java
我的工作站上的JDK 6_34不知道我的同事使用的是什么版本
我已经看过代码了..。很多次。没什么特别的。即使它都是在一个线程中执行的,这个线程也没有竞争对手做相同的工作或访问相同的文件。
这种情况有没有人熟悉?
附言:我真的希望这个问题确实属于这里。如果不是,我由衷地道歉。
编辑:
至于日志记录,我们使用log4j。
操作系统: Windows XP /我的机器。一个同事有相同的,另一个使用Win7 /
CPU: E7500 @ 2.93 GHz
RAM: 2 GB DDR2
另一台机器基本上是相同的。第三个的配置对我来说是未知的,因为它是新的,不是我的工作站。
在我的情况下,文件都是从本地硬盘加载/存储到本地硬盘的。
我最担心的是,我们使用的是一个没有源代码的平台,因为,我们已经支付了许可证,但没有源代码>.<
发布于 2012-09-08 07:01:50
添加日志记录将同步点添加到您的逻辑中。也许你所看到的是一个(奇怪的)副作用。
发布于 2012-09-08 07:08:56
我的理论是,添加日志记录会改变应用程序的线程调度模式。
通常,这应该无关紧要。但是,如果应用程序中的潜在问题与线程调度有关,那么日志记录改变观察到的行为也就不足为奇了。
我建议您审计代码库的相关部分,查找Thread.sleep(...)调用、Thread.yield()调用、代码轮询的位置等。还要考虑到这可能会在第三方库代码中发生。
@OldCurmudgeon的答案包括你应该寻找的两个简单版本。即使使用sleep(0)也是浪费的,尽管它比N明显大于零的sleep(N)更好。
发布于 2012-09-08 07:03:03
您是否能够在您正在使用的计算机上重现客户的原始问题(即,您是否能够像您提到的那样,提取文件并花费4-10秒)?
如果不是,那么涉及的因素太多了,无法明确地将功劳归功于log4j。这件事上我和威尔夫是一致的。没有办法添加日志可以可靠地提高一段code...at的速度,至少我想不出来。
如果您能够重现问题,然后添加日志,然后使用相同的硬件、相同的逻辑和相同的文件获得如此大的速度提升,那么您就正式地让我大吃一惊了。
https://stackoverflow.com/questions/12326254
复制相似问题