我希望了解哪些操作会对CPU负载产生不成比例的影响,以及开发常见操作的相对成本的直觉。为了最小化概括,请假定使用Oracle 7 HotSpot JVM。
例如:
- 构造大量对象是否会消耗CPU(我知道它会消耗内存 :-))? - 竞争监视器是否会消耗CPU?即如果我们有多个线程尝试进入相同的同步块,那么被阻塞的线程是否也会消耗CPU周期? - 上述操作的相对成本是多少?例如,“new”一个单独的对象与迭代X元素数组的成本相同
有什么提示可以让我更好地了解典型操作的相对CPU成本?
您能推荐一些相关的好读物吗?
谢谢,
澄清:
感谢早期的回复,但请注意:
- 我没有问“为什么我的应用程序很慢” - 了解使用分析器将有助于识别特定应用程序中的问题,例如GC可能会占用CPU,或者GC tenured generation比Eden space更昂贵 - 大多数操作只有在大量执行时才变得昂贵(即如果很少使用,则几乎没有操作是昂贵的) - 相反,我正在寻求关于相对CPU成本的指导,特别是关于上述操作(假设“Web-scale”应用程序使用所有已提及的操作相等的数量-很多)。
例如,我已经知道:
- 长方法调用链不会对CPU负载产生显着影响(因此通常可以自由使用方法委托) - 抛出异常比使用条件语句更昂贵(因此在高性能敏感代码中通常首选后者作为流程控制)
...但是实例化新对象或竞争监视器呢?这两个操作中的任何一个都会对CPU负载产生重要(甚至支配性)的贡献吗(假设我不关心延迟或堆大小)?
例如:
- 构造大量对象是否会消耗CPU(我知道它会消耗内存 :-))? - 竞争监视器是否会消耗CPU?即如果我们有多个线程尝试进入相同的同步块,那么被阻塞的线程是否也会消耗CPU周期? - 上述操作的相对成本是多少?例如,“new”一个单独的对象与迭代X元素数组的成本相同
有什么提示可以让我更好地了解典型操作的相对CPU成本?
您能推荐一些相关的好读物吗?
谢谢,
澄清:
感谢早期的回复,但请注意:
- 我没有问“为什么我的应用程序很慢” - 了解使用分析器将有助于识别特定应用程序中的问题,例如GC可能会占用CPU,或者GC tenured generation比Eden space更昂贵 - 大多数操作只有在大量执行时才变得昂贵(即如果很少使用,则几乎没有操作是昂贵的) - 相反,我正在寻求关于相对CPU成本的指导,特别是关于上述操作(假设“Web-scale”应用程序使用所有已提及的操作相等的数量-很多)。
例如,我已经知道:
- 长方法调用链不会对CPU负载产生显着影响(因此通常可以自由使用方法委托) - 抛出异常比使用条件语句更昂贵(因此在高性能敏感代码中通常首选后者作为流程控制)
...但是实例化新对象或竞争监视器呢?这两个操作中的任何一个都会对CPU负载产生重要(甚至支配性)的贡献吗(假设我不关心延迟或堆大小)?
new
可能意味着更多。例如,实例化Calendar
是很重的。 - Marko Topolnik