我刚刚写了一个程序来测试CPU缓存对速度性能的影响。
void* foo(void* ptr)
{
int* r = (int*) ptr;
for (int i = (r - s); i < N; i += NUM_THREADS)
*r += num[i];
return NULL;
}
void* bar(void* ptr)
{
int* r = (int*) ptr;
int idx = r - s;
int block = N/NUM_THREADS;
int start = idx * block, end = start + block;
for (int i = start; i < end; ++i)
*r += num[i];
return NULL;
}
基本上,foo()
进行隔行扫描,另一方面,bar()
逐块扫描阵列。
测试结果表明bar()
要快得多:
gcc ping-pong.c -std=gnu99 -lpthread -O2 ; ./a.out
1.077037s
0.395525s
那么如何解释这个结果呢?
完整的源代码在:https ://gist.github.com/4617935
更新:删除所有 if 语句