基本思想
算法:在内存中建立一个大数据,通过记录读取的过程,理解内存的速度。
主要代码包括三块:
- 定义大数据
这里定义了一个长度约为10亿(230)的数组。 - 随机初始化这个数据
使用Random函数对数组进行初始化。 - 进行数据求和
使用循环进行数据累加。
主要代码如下所示。
package hello;
public class MemoryTest {
public static void main(String[] args) {
// data length: 1 GiB.
int len = 1024 * 1024 * 1024;
long result = 0;
int runningTimes = 10;
System.out.println("Declare an array of size: " + len);
long t1 = System.currentTimeMillis();
int[] its = new int[len];
// int[] its1 = new int[len];
System.out.println("Declaration Time(ms): " + (System.currentTimeMillis() - t1));
long tw = 0; // 写数据时间
long tr = 0; // 纯计算据时间
long tarr = 0; // 读取array计算时间
System.out.println("---------------- Writing Test ----------------");
for (int i = 0; i < runningTimes; i++) {
long ta = System.currentTimeMillis();
int v = (int) (ta % (i + 10));
for (int j = 0; j < len; j++)
its[i] = v;
long tb = System.currentTimeMillis();
for (int j = 0; j < len - 1; j++) {
result += v;
}
long tc = System.currentTimeMillis();
for (int j = 0; j < len - 1; j++) {
result += its[j];
}
long td = System.currentTimeMillis();
tw += tb - ta;
tr += tc - tb;
tarr += td - tc;
System.out.printf("Take %d: Writing: %d ms. Direct: %d ms. Reading: %d ms. Results: %d.\n", i, tb - ta, tc - tb, td - tc, result);
}
System.out.printf("Writing: %d ms. Direct: %d ms. Reading: %d ms. Results: %d.\n", tw, tr, tarr, result);
}
}
测试结果
测试如果如下所示
Declare an array of size: 1073741824
Declaration Time(ms): 1861
---------------- Writing Test ----------------
Take 0: Writing: 33 ms. Direct: 352 ms. Reading: 479 ms. Results: 3221225472.
Take 1: Writing: 65 ms. Direct: 337 ms. Reading: 553 ms. Results: 11811160067.
Take 2: Writing: 60 ms. Direct: 337 ms. Reading: 566 ms. Results: 18253611022.
Take 3: Writing: 57 ms. Direct: 337 ms. Reading: 565 ms. Results: 24696061983.
Take 4: Writing: 43 ms. Direct: 370 ms. Reading: 552 ms. Results: 34359738422.
Take 5: Writing: 57 ms. Direct: 338 ms. Reading: 556 ms. Results: 35433480278.
Take 6: Writing: 42 ms. Direct: 336 ms. Reading: 562 ms. Results: 48318382199.
Take 7: Writing: 42 ms. Direct: 336 ms. Reading: 565 ms. Results: 55834575012.
Take 8: Writing: 42 ms. Direct: 336 ms. Reading: 599 ms. Results: 57982058712.
Take 9: Writing: 52 ms. Direct: 346 ms. Reading: 544 ms. Results: 71940702478.
Writing: 493 ms. Direct: 3425 ms. Reading: 5541 ms. Results: 71940702478.
结论
- 写内存:1G长的数组所耗时间约为49.3ms,读取速度约为:20G/s
- 读内存:时间为 (5541-3425)/10 = 211 ms,写入速度约为: 5G/s
初步结论:内存写比读更快,结论与常规差异较大,需要进一步分析。