Java数组访问性能测试结论为157.1 亿次/秒

昨天的测试对数组的访问初步有了一个了解,今天我们再做另外一个测试。
以下是测试代码,和昨天一样,不过现在我们做点小修改,如下所示。

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
---------------------------------------------------------
发布了326 篇原创文章 · 获赞 94 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/weixin_43145361/article/details/103535965