对应代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define A_NUM 10000000
#define B_NUM 1000
// 定义为全局,避免栈溢出,且便于观察内存访问
int a[A_NUM];
int b[B_NUM];
// 防止编译器将循环优化掉的“逃逸”函数(如果编译器太智能)
void t1() {
int i, j;
for (i = 0; i < A_NUM; i++) {
for (j = 0; j < B_NUM; j++) {
b[j]++; // 让数组 b 的每个元素都增加
}
}
}
void t2() {
int i, j;
for (j = 0; j < B_NUM; j++) {
for (i = 0; i < A_NUM; i++) {
a[i]++; // 让数组 a 的每个元素都增加
}
}
}
double measure_time(void (*func)()) {
clock_t start = clock();
func();
clock_t end = clock();
return (double)(end - start) / CLOCKS_PER_SEC;
}
int main() {
// 预热(避免首次运行的冷缓存影响)
t1();
t2();
const int runs = 5;
double t1_total = 0, t2_total = 0;
for (int k = 0; k < runs; k++) {
// 重置数组(避免不同调用间的累积影响)
for (int i = 0; i < A_NUM; i++) a[i] = 0;
for (int i = 0; i < B_NUM; i++) b[i] = 0;
t1_total += measure_time(t1);
// 重置数组
for (int i = 0; i < A_NUM; i++) a[i] = 0;
for (int i = 0; i < B_NUM; i++) b[i] = 0;
t2_total += measure_time(t2);
}
printf("t1 average time: %.4f seconds\n", t1_total / runs);
printf("t2 average time: %.4f seconds\n", t2_total / runs);
return 0;
}
运行结果:
t1比t2快