为阵列座位分配值很慢

时间:2013-04-15 19:58:55

标签: c performance pointers

我正在使用时差学习来训练计算机。我注意到我的经纪人玩1场比赛(比如10秒)的速度非常慢,应该可以在大约20分钟内打出100.000场比赛。在缩小问题的范围之后,我发现了这一行。以下代码中的5是麻烦制造者。代码取自更大的函数。

int i;
 double td = newValue - oldValueWhite;
 for(i = 0; i<FEATURES_SIZE; i++)
 {
     Value[i] =Value[i] + alpha*(td)*((double)phiOldWhite[i]);
 }

但是,以下代码运行顺利:

 double tmp:
 int i;
 double td = newValue - oldValueWhite;
 for(i = 0; i<FEATURES_SIZE; i++)
 {
     tmp =Value[i] + alpha*(td)*((double)phiOldWhite[i]);
 }

我不确定编译器是否只是忽略了计算,或者是否为Value [i]分配新值非常慢。值得一提的是,Value被作为指向函数的指针。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

如果在tmp循环后未使用for,则编译器可能只是优化for循环。

答案 1 :(得分:0)

如果您使用的是C99,可以尝试以下方法(或使用gcc扩展程序__restrict__):

int i;
double restrict *Value = ...;        // tell compiler Value and phiOldWhite are 
double restrict *phiOldWhite = ...;  // different memory areas

double td = (newValue - oldValueWhite) * td;
for (i = 0; i < FEATURES_SIZE; i++)
{
    Value[i] += td * phiOldWhite[i];
}

我为phiOldWhite使用了double类型,但你可以使用你的类型。