我想了解哪些类型的操作对 CPU 负载的贡献不成比例,并对常见操作的相对成本有一个直觉。为了尽量减少泛化,请假设 Oracle 7 HotSpot JVM。
例如:
- 构造大量对象会消耗 CPU(我知道它会消耗内存:-))吗?
- 满足显示器成本CPU?即,如果我们有多个线程试图进入同一个同步块,阻塞的线程是否也会消耗 CPU 周期?
- 上述操作的相对成本?例如,“新建单个对象与迭代 X 元素数组所消耗的 CPU 相同”
关于开发典型操作的相对 CPU 成本直觉的任何提示?
您可以推荐有关该主题的任何好读物吗?
谢谢你,
澄清
感谢您的早期回复,但请注意我:
- 我不是在问“为什么我的应用程序很慢”
- 了解使用分析器将有助于识别特定应用程序中的问题,例如,GC 会占用 CPU,或者 GC 的终身代比 Eden 空间更昂贵
- 了解大多数操作只有在大量执行时才会变得昂贵(即,如果谨慎使用,几乎没有任何操作是昂贵的)
相反,我正在寻找相对CPU 成本的指导,尤其是上述操作(让我们假设一个“网络规模”应用程序使用所有提到的相同数量的操作 - 很多)。
例如,我现在已经:
- 长方法调用链不会显着增加 CPU 负载(因此通常可以自由地使用方法委托)
- 抛出异常比使用条件更昂贵(因此后者通常首选用于高度性能敏感代码中的流控制)
...但是实例化新对象或满足监视器呢?这些操作中的任何一个是否会对大规模 CPU 负载(假设我不关心延迟或堆大小)产生重大(主要?)贡献者?