性能优化的首要原则

让我们从没有明显性能瓶颈的系统开始。 我的意思是,没有任何明显的算法问题会导致系统瘫痪。 例如,一个紧密的循环,它从文件中读取属性而不缓存结果。

您希望系统尽可能快地运行,从哪里开始? 大多数探查器(例如,我目前最喜欢的YourKit)都具有用于内存跟踪和CPU跟踪的模块。 由于练习的目的是为了使程序运行更快,因此您可以从CPU开始吗? –错! 首先要看的是内存,尤其是对象分配。

首先,您应该始终尝试做的是尽可能减少对象分配。 之所以不直观(至少对我来说不是),是因为我们知道对象分配是快速的,实际上,即使与C之类的语言相比,它的分配速度也非常快。在什么情况下可以更快-但无可否认的是它快)。 那么,如果对象分配如此之快,为什么会减慢我的程序速度,为什么我应该从最小化对象分配开始呢?

  1. 这给垃圾收集器带来了额外的压力。 在系统中拥有更多的对象(尤其是如果它们不是短暂的)将使您的垃圾收集器获得更多的工作,从而降低系统的速度。
  2. 它会用垃圾填满您的CPU缓存,迫使它们进行刷新,并且必须继续向上移至L2和L3缓存,然后再进入主内存,以检索数据。 粗略地说,必须从中获取数据的堆栈的每个级别花费的时间要长一个数量级(请参见下图)。 因此,即使对象分配很快,它也会导致高速缓存未命中,从而导致许多浪费的CPU周期,从而降低程序速度。
  3. 首先做简单的事情。 通常,在查看CPU性能跟踪时,减少分配(通过缓存等方法)比修复算法要容易得多。 更改分配可能会完全改变程序的性能特征,并且在此之前对算法进行的任何更改都可能浪费时间。
  4. 探查器说谎( 这是必须观看的视频 )。 当查看CPU跟踪中瓶颈所在的位置时,真的很难知道。 但是,探查器与分配无关。
  5. 高对象分配通常在代码中难闻的气味 寻找多余的对象分配将导致您遇到算法问题。

性能优化的首要原则

翻译自: https://www.javacodegeeks.com/2015/01/first-rule-of-performance-optimisation.html