2013-04-15 54 views
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]); 
} 

我不知道這是否是編譯器只是忽略的計算,或者新的價值,以價值分配[i]是真的很慢。值得一提的是,Value被用作指向函數的指針。

任何想法?

回答

3

如果在for循環之後沒有使用tmp,則編譯器可能會簡單地優化for循環。

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]; 
} 

我使用類型爲double phiOldWhite,但是你可以使用你的類型。