2

我对分析应用程序以提高性能有点陌生。我已选择 YourKit 作为我的分析器。毫无疑问,YourKit 提供了非常有趣的统计数据。我遇到困难的地方是如何处理这些统计数据。

例如,考虑一个对 JAXB POJO 进行操作的方法。该方法遍历 POJO 以访问深深嵌套在 XML 中的标记/元素。这需要 4 层 for 循环才能到达元素/标签,如下所示:

   List<Bundle> bundles = null;
   List<Item> items = null;
   for(Info info : data) { 
      bundles = info.getBundles();
      for(Bundle bundle : bundles) {
         items = bundle.getItems();
         //.. more loops like this till we get to the required element
       }          
    }

YourKit 告诉我,上面的代码是一个“热点”,每次调用包含此代码的方法都会收集 80 个对象的垃圾。上面的代码只是一个例子,并不是我卡住的唯一部分。大多数时候,我不知道如何处理分析器提供的信息。我可以做些什么来减少上述代码中临时对象的数量?是否有任何明确的原则可以提高应用程序的性能?分析应用程序时要查找哪些统计信息以及每种统计信息有什么含义?

编辑:分析应用程序的主要目标是增加吞吐量和响应时间。当前吞吐量仅为所需吞吐量的 10%!

4

3 回答 3

1

专注于与您的绩效目标相关的统计数据。您对最小响应时间感兴趣,因此请查看每个方法对响应时间的贡献程度,并关注那些贡献很大的方法(对于单线程处理,这只是方法调用期间经过的时间,对该方法的所有调用求和)。我不确定 YourKit 将什么定义为热点(查看文档),但它可能是累积经过时间最长的方法,所以热点是一件好事。相反,对象分配对响应时间没有直接影响,并且在您的情况下是无关紧要的(除非您已经确定垃圾收集器贡献了很大比例的 cpu 时间,而它通常不会)。

于 2012-09-13T11:18:10.773 回答
1

我完全同意给出的答案。

我想补充一点,考虑到您的具体示例,您实际上可以通过使用xpath api访问 XML 中的特定位置来进行改进。

In situations where you don't need to actually iterate the entire DOM, this should be your first choice since it is declarative and hence more expressive and less error prone.

It would often give you superior performance as well (For very complex queries it may not be the case, but you seem to have a simple scenario).

于 2012-09-13T15:20:47.583 回答
0

改进循环的一种方法是更改​​您的架构并从本质上展平模型,当然这取决于您是否可以更改架构。这样生成的 Java 将不需要 4 层循环。当然,在一天结束时,您需要问自己代码真的有问题吗 - 80 个对象正在被 GC 处理,所以?您的应用程序运行缓慢吗?您是否遇到内存问题?记住过早的优化是万恶之源!

分析和优化是一头复杂的野兽,取决于可能的事情(Java 版本、32 位和 64 位操作系统等)。此外,优化可能并不总是需要更改代码,例如,您可以通过更改 JVM 上的 GC 策略来解决问题 - 例如,在您的代码创建许多需要 GC 的小对象的情况下,有更有效的 GC 策略频繁地。如果您有详细信息,可能会更容易为您提供帮助,但是您的问题似乎太宽泛了。事实上,有很多关于主题的书籍可能值得一读。

于 2012-09-13T11:20:15.330 回答