我尝试了一个比较这三个选项的测试用例 -global, local, local static
用于 4d 向量的简单向量内积的大约 2000 万次操作。这是在 VS2010 32 位发行版上完成的。结果如下:
DPSUM:600000000 时间:78| DPSUM:600000000 时间:62| DPSUM:600000000 时间:63| DPSUM:600000000 时间:47| DPSUM:600000000 时间:46| DPSUM:600000000 时间:78| DPSUM:600000000 时间:47| DPSUM:600000000 时间:47| DPSUM:600000000 时间:78| DPSUM:600000000 时间:47| DPSUM:600000000 时间:47| DPSUM:600000000 时间:62| DPSUM:600000000 时间:62| DPSUM:600000000 时间:47| DPSUM:600000000 时间:63| DPSUM:600000000 时间:46| DPSUM:600000000 时间:63| DPSUM:600000000 时间:62| DPSUM:600000000 时间:47| DPSUM:600000000 时间:47| DPSUM:600000000 时间:78| DPSUM:600000000 时间:47| DPSUM:600000000 时间:46| DPSUM:600000000 时间:78| DPSUM:600000000 时间:47| DPSUM:600000000 时间:47| DPSUM:600000000 时间:62| DPSUM:600000000 时间:63| DPSUM:600000000 时间:47| DPSUM:600000000 时间:62|
第一列是static const
,第二列是 ,local
第三列是global
。如果您想在您的平台上尝试,我将发布示例代码。看起来static local
和local
同样快 - 至少对于这个编译器(可能是由于一些内部优化。
下面的代码:
#include <stdio.h>
#include <windows.h>
int ag[] = {1,2,3,4}; int bg[] = {1,2,3,4};
int dp1(){
static const int a[] = {1,2,3,4}; static const int b[] = {1,2,3,4};
return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];
}
int dp2(){
int a[] = {1,2,3,4}; int b[] = {1,2,3,4};
return a[0]*b[0] + a[1]*b[1] + a[2]*b[2] + a[3]*b[3];
}
int dp3(){
return ag[0]*bg[0] + ag[1]*bg[1] + ag[2]*bg[2] + ag[3]*bg[3];
}
int main(){
int numtrials = 10;
typedef int (*DP)();
DP dps[] = {dp1, dp2, dp3};
for (int t = 0; t < numtrials; ++t){
int dpsum[] = {0,0,0};
for (int jj =0; jj <3; ++jj){
DWORD bef, aft;
bef = GetTickCount();
for (int ii =0; ii< 20000000; ++ii){
dpsum[jj] += dps[jj]();
}
aft = GetTickCount();
printf("DPSUM:%d TIME:%d| ", dpsum[jj], aft - bef);
}
printf("\n");
}
getchar();
}