昨天的测试对数组的访问初步有了一个了解,今天我们再做另外一个测试。
以下是测试代码,和昨天一样,不过现在我们做点小修改,如下所示。
public class CPUSpeedTest {
public static void main(String[] args) throws Exception {
long r = 0;
long t1 = System.currentTimeMillis();
int[] data = new int[1000];
for(int i = 0; i < data.length; i++)
data[i] = i;
for (int i = 0; i < 1000; i++) {
for (int j = 0; j < 10000; j++) {
for (int k = 0; k < 10000; k++) {
r += (i + j * k) % data.length; // Test1
r += data[(i + j * k) % data.length]; // Test2
}
}
}
long t2 = System.currentTimeMillis();
System.out.println("v1: r = " + r + ", " + (t2 - t1) + "ms");
}
}
r += (i + j * k) % data.length;
将在Test1中执行,而r += data[(i + j * k) % data.length];
将在Test2中执行。
为了减少误差的影响,这里进行了1000亿次的运行。两种测试的时间分别如下:
Test1: r = 49950000000000, time = 202574ms
Test2: r = 49950000000000, time = 208939ms
Test2只比Test1多了一个数据访问操作,所以在1000亿次的循环中,共执行了1000亿次的数据访问操作,多用了 208939ms - 202574ms = 6365ms,所以数据访问效率为 1000亿 除以 6.365秒 = 157.1 亿次/秒。
附其他测试结果:
for: 826.4 亿次/秒
r++:942.2 亿次/秒
j*k: 51.6 亿次/秒
i*j*k: 31.7 亿次/秒
i+j+k: 44.0 亿次/秒
t0: for 循环;
t1: r += i + j + k;
t2: r += i * j * k;
注: 以下测试是100亿次测试时间(单位ms)
---------------------------------------------------------
t0+t1+t2 5647 5650 5663 5650 5658 5654
t0+t1 2392 2392 2394 2392 2393 2393
t0+t2 3379 3384 3382 3384 3381 3382
2t0+t1+t2 5771 5776 5776 5776 5774 5775
for用时 124 126 113 126 116 121
---------------------------------------------------------