小师妹:F师兄,之前你讲了那么多JVM中JIT在编译中的性能优化,讲真的,在工作中我们真的需要知道这些东西吗?知道这些东西对我们的工作有什么好处吗?
um…这个问题问得好,知道了JIT的编译原理和优化方向,我们的确可以在写代码的时候稍微注意一下,写出性能更加优秀的代码,但是这只是微观上了。
如果将代码上升到企业级应用,一个硬件的提升,一个缓存的加入或者一种架构的改变都可能比小小的代码优化要有用得多。
就像是,如果我们的项目遇到了性能问题,我们第一反应是去找架构上面有没有什么缺陷,有没有什么优化点,很少或者说基本上不会去深入到代码层面,看你的这个代码到底有没有可优化空间。
第一,只要代码的业务逻辑不差,运行起来速度也不会太慢。
第二,代码的优化带来的收益实在太小了,而工作量又非常庞大。
所以说,对于这种类似于鸡肋的优化,真的有必要存在吗?
其实这和我学习物理化学数学知识是一样的,你学了那么多知识,其实在日常生活中真的用不到。但是为什么要学习呢?
我觉得有两个原因,第一是让你对这个世界有更加本质的认识,知道这个世界是怎么运行的。第二是锻炼自己的思维习惯,学会解决问题的方法。
就像算法,现在写个程序真的需要用到算法吗?不见得,但是算法真的很重要,因为它可以影响你的思维习惯。
所以,了解JVM的原理,甚至是Assembly的使用,并不是要你用他们来让你的代码优化的如何好,而是让你知道,哦,原来代码是这样工作的。在未来的某一个,或许我就可能用到。
好了,言归正传。今天给小师妹介绍一个很奇怪的例子:
private static int[] array = new int[64 * 1024 * 1024];
@Benchmark public void test1() { int length = array.length; for (int i = ; i < length; i=i+1) array[i] ++; } @Benchmark public void test2() { int length = array.length; for (int i = ; i < length; i=i+2) array[i] ++; }
小师妹,上面的例子,你觉得哪一个运行的更快呢?
小师妹:当然是第二个啦,第二个每次加2,遍历的次数更少,肯定执行得更快。
好,我们先持保留意见。
第二个例子,上面我们是分别+1和+2,如果后面再继续+3,+4,一直加到128,你觉得运行时间是怎么样的呢?
小师妹:肯定是线性减少的。
好,两个问题问完了,接下来让我们来揭晓答案吧。