繁体   English   中英

用于性能评估的Java统计信息收集

[英]java statistics collection for performance evaluation

从应用程序收集和报告性能统计分析的最有效方法是什么?
如果我有一个使用一系列网络API的应用程序,并且想在运行时报告统计信息,例如

Method doA() was called 3 times and consumed on avg 500ms  
Method doB() was called 5 times and consumed on avg 1200ms etc  

然后,我想到了使用一个定义明确的数据结构(集合),每个线程每次远程调用都会更新,并且可以将其用于报告。

但我认为,这会浪费时间进行统计收集,从而使性能变差。 我对么? 如果我为此使用了后台线程,而进行远程调用的其他线程却没有意识到此集合的收集,该如何处理?

谢谢

Aspectj或ThreadLocal编码对我来说似乎有点过度设计。

我认为JavaSimon或Jamon在您的应用中具有一些特殊的启动/停止功能非常适合您,请参阅: http : //code.google.com/p/javasimon/wiki/GettingStarted#Hello_world

http://jamonapi.sourceforge.net/#SimpleExamples

请参见:“使用aspectj剖析所选方法” 使用aspectj剖析所选方法

有多种解决方法:

  1. 动态更改(易于代码-很有可能更改性能):在这里,您可以使用代码编织(AspectJ或类似的库)或动态代理进行计数。 这具有安装速度非常快的优点,并且可以为您提供总体思路。 但是,如果您对应用程序进行了非常精细的调整,它将给您的性能带来最大的开销,并且会改变您的结果。

  2. 静态更改(需要更多代码-降低性能影响):在此处,您将根据想要如何跟踪统计信息(每个线程或跨应用程序)创建一些ThreadLocals或ConcurrentHashMap,这在这里是使用字符串键的地图查找,没有锁定保证和整数增量。 哪一个不会弄乱您的数据,而且是相当稳定的,可以单独测量并从统计数据中排除。

希望这可以帮助。

我相信,执行所需操作的最简单方法是将slf4j分析添加到您的应用程序并修改报告方法。 这不是一个透明的解决方案,但是非常简单。

http://www.slf4j.org/extensions.html#profiler

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM