我想了解哪些类型的操作不成比例地增加CPU负载,并对常见操作的相对成本形成直觉。若要尽量减少泛化,请假定Oracle7JVm。
例如:
对于开发典型操作相对CPU成本的直觉,有什么建议吗?
关于这个问题,你有什么好的建议吗?
谢谢,
澄清
感谢您的早期答复,但请注意:
相反,我正在寻找相对CPU成本的指导,特别是w.r.t。上面的操作(让我们假设一个‘网络规模’应用程序使用所有操作提到的等量-很多)。
例如,我现在已经知道:
...but如何实例化新对象或监视器的内容?这两个行动中的任何一个都是重要的(占主导地位)吗?CPU负载的贡献者(假设我不关心延迟或堆大小)在规模上?
发布于 2012-10-19 19:16:02
我认为你们中的相对CPU消耗如下:
1)数组的索引;它速度快;它只是寻址
2)监视器--速度较慢;挂起和等待的线程不消耗CPU,切换占用的CPU很少,但比索引更多。
3)如果一个对象是复杂的,并导致子对象的创建,那么创建一个对象可能是缓慢的;创建一个new Object()可能比线程切换稍微慢一点;但是,我可能错了,而且它是相同的;无论如何,是可比的。
4)抛出/捕获异常非常慢;创建对象要慢10到100倍。
发布于 2012-10-19 18:44:17
一次手术总是快的。一个可测量的CPU负载--一项操作被执行了几千次,甚至是一百万次或十亿次。因此,您需要注意各种循环调用和大量递归调用。
通常,并不是很明显某件事情被执行了一百万次,因为显而易见的循环只执行了一百次。但是它调用一个函数,该函数执行某项操作100次,其中包含执行一个操作100次的另一个函数。那样的话,你就会有一些东西被运行了上百万次。在一个web应用程序中,它与并发请求的数量相乘。
由于发现真正的热点并不容易,所以您可能希望使用Java的特殊性能分析工具来研究您的应用程序。通过这种方式,您可以了解哪些模式是CPU密集型的,哪些模式不是。
Java中的另一件事是,如果您分配了大量无法快速释放的内存(无论是小块还是小块),那么垃圾收集就会成为CPU的霸主。使用大量的字符串(例如,在处理XML时)可能就是这样的原因。
但最好的办法是使用工具进行分析。
发布于 2013-03-04 11:17:40
抛出一个异常是非常便宜的。昂贵的部分通常只是创建异常对象,因为这调用了fillInStackTrace(),这很昂贵。如果您忽略了这一点,其余的将是快速的(它可以与C中的goto一样快)。
来源:价廉
下面是一个页面中包含有关OpenJDK JVM的内部信息,其中列出了有关性能的信息。以获取更多信息。
https://stackoverflow.com/questions/12980029
复制相似问题