作为一名非计算机科班出身的程序员对计算机的底层架构知之甚少,开发也一直以Java程序为主,写代码的时候很少考虑底层操作系统和硬件什么的。
直到今天开始学习Disruptor框架,里面提到了很多Cache的相关内容,才发现Java程序原也应该懂得计算机结构等基础知识!学习到Cache Line的概念,突然想到了以前看到的神奇的提高循环执行速度的神奇的7!
64位机器的Cache Line中可以保存8个word, 这是不是和神奇的7有关系呢?
我的64位计算机现在装的是32位的系统,那对我来说是3比较起作用,还是7比较起作用呢?
于是有了如下的一个简单实验
package com.eric.learn.javacore.test;
public class FunLoop {
public static void main(String[] args) {
long[] huge_array = new long[(int) Math.pow(2, 25)];
buildHugeArray(huge_array);
sequenceVisit(huge_array);
batchVisitBy3(huge_array);
batchVisitBy7(huge_array);
}
private static void batchVisitBy3(long[] huge_array){
long start = System.currentTimeMillis();
long length = huge_array.length;
long loop_times = length - length % 3;
for(int i = 0; i < loop_times; i+= 3){
long l = huge_array[i];
l = huge_array[i + 1];
l = huge_array[i + 2];
}
long end = System.currentTimeMillis();
System.out.println("3 times batch visit cost " + (end -start) + " milliseconds");
}
private static void batchVisitBy7(long[] huge_array) {
long start = System.currentTimeMillis();
long length = huge_array.length;
long loop_times = length - length % 7;
for(int i = 0; i < loop_times; i+= 7){
long l = huge_array[i];
l = huge_array[i + 1];
l = huge_array[i + 2];
l = huge_array[i + 3];
l = huge_array[i + 4];
l = huge_array[i + 5];
l = huge_array[i + 6];
}
long end = System.currentTimeMillis();
System.out.println("7 times batch visit cost " + (end -start) + " milliseconds");
}
private static void sequenceVisit(long[] huge_array) {
long start = System.currentTimeMillis();
long length = huge_array.length;
for(int i =0 ; i< length; i++){
long l = huge_array[i];
}
long end = System.currentTimeMillis();
System.out.println("sequence visit cost " + (end -start) + " milliseconds");
}
private static void buildHugeArray(long[] huge_array) {
for(int i=0; i < huge_array.length; i++){
huge_array[i] = (long) (Math.random() * Integer.MAX_VALUE);
}
}
}
为了逻辑简单,在3或7批量的时候,忽略掉了最后的不再一个Loop内的内容。
然后是在我机器上的输出
sequence visit cost 50 milliseconds 7 times batch visit cost 17 milliseconds 3 times batch visit cost 30 milliseconds
还是跟最终的硬件结构相关!如果将来有了128位机器,那是不是最快的循环就是127了呢?