这个网站上已经存在很多性能问题,但是我发现几乎所有这些都是特定于问题且相当狭窄的问题.几乎所有人都重复这些建议,以避免过早优化.
我们假设:
我在这里寻找的是在一个关键算法中挤出最后几个百分点的策略和技巧,除此之外别无他法.
理想情况下,尝试使答案语言不可知,并在适用的情况下指出建议策略的任何缺点.
我将使用我自己的初步建议添加回复,并期待Stack Overflow社区可以想到的任何其他内容.
如果某个东西正在使单线程程序占用,比如10倍,那么就可以在其上运行一个分析器.您也可以通过"暂停"按钮暂停它,您将看到它正在做什么.
即使它比它应该慢了10%,如果你停止它多次,不久你会看到它反复做不必要的事情.通常问题是在堆栈中间某处不是真正需要的函数调用.这不能衡量问题,但确实找到了.
编辑:反对意见主要假设您只采取1个样本.如果你是认真的,请采取10.任何一行代码,导致一定比例的浪费,如40%,将平均出现在该部分样本的堆栈上.瓶颈(单线程代码)无法隐藏它.
编辑:为了表明我的意思,许多反对意见的形式是"没有足够的样本,所以你看到的可能完全是虚假的" - 关于机会的模糊观点.但是,如果任何可识别的描述,不仅仅是在常规或常规活动中,在30%的时间内有效,那么在任何给定样本上看到它的概率是30%.
然后假设只采集了10个样本.在10个样本中看到问题的次数遵循二项分布,并且看到它0次的概率是.028.看到它1次的概率是.121.2次,概率为.233,而3次则为.267,之后下降.由于看到它少于两次的概率是.028 + .121 = .139,这意味着看到它两次或更多次的概率是1 - .139 = .861.一般规则是,如果您看到可以修复两个或更多样本的内容,则值得修复.
在这种情况下,在10个样本中看到它的机会是86%.如果你是14%没有看到它的人,那就去做更多的样品.(如果样本数量增加到20,那么两次或多次观察的几率会增加到99%以上.)所以它没有经过精确测量,但已经准确找到了,重要的是要了解它它可能很容易成为分析器无法实际找到的东西,例如涉及数据状态的东西,而不是程序计数器.
我正在调用供应商的Java API,并且在某些服务器上看起来JVM在登录API(CPU使用率为100%)后进入低优先级轮询循环.其他服务器上的相同应用程序不会出现此行为.这发生在WebSphere和Tomcat上.设置环境很棘手,因此很难尝试在Eclipse中进行分析.
有没有办法分析(或其他一些检查方法)在Tomcat中运行的现有Java应用程序,以找出在此spinwait类状态下正在执行的方法?应用程序只在进入此状态时执行一种方法(供应商的方法).供应商无法复制行为(当然).
更新:
使用JConsole我能够确定谁在运行以及他们在做什么.我花了几个小时才弄清楚它为什么这样做.问题最终是供应商使用的API jar与其使用的数据库配置不完全匹配.默认情况下,在配置中存在轻微不匹配的服务器上启用跟踪和性能监视.我用了一个不同的罐子,一切都很好.
谢谢,约书亚,你的回答.JConsole非常易于设置和用于监视现有应用程序.
@Cringe - 我做了一些你建议的一些选项的实验.设置JProfiler时遇到了一些问题,看起来不错(但价格昂贵).继续前进我继续添加Eclipse Profiler插件,我将查看不同的开源分析器来比较功能.
我正在实现LZW算法.我已经成功地为字符串和文本文件实现了它,并且我正在修改我的代码以使用二进制文件,例如图像或可执行文件(因为我无法将这些文件作为字符串读取).
我已经用String类型替换了我的代码中的ArrayList<Byte>类型.我的代码现在正确压缩和解压缩二进制文件,但它至少慢了10倍!在速度是关键因素的压缩应用中,这是不可接受的.
我是否正确替换ArrayList<Byte>了String.有类似功能的更快的替代方案吗?注意,LZW算法需要数组大小调整,因此标准arrays[]不适合.
问候.