Зацикливание в два раза быстрее, чем зацикливание в C ++? - PullRequest
1 голос
/ 21 апреля 2011

Вот небольшой тест, который я сделал, и результат меня удивил: выполнение одного цикла дважды было примерно вдвое быстрее, чем цикл один раз. Я предполагаю, что это из-за доступа к памяти?

float* A = new float[1000000];
float* B = new float[1000000];
int h,w;
h = w = 1000;
CString txt;
double time1, time2;

time1 = Timer::instance()->getTime();
for(int j = 0; j < h; j++){
    for(int i = 0; i < w; i++){
        A[i+j*w] = 1;
        B[i+j*w] = 1;
    }
}
time2 = Timer::instance()->getTime();
txt.Format(_T("Both in same loop = %f"),time2-time1);
AfxMessageBox(txt);

time1 = Timer::instance()->getTime();
for(int j = 0; j < h; j++){
    for(int i = 0; i < w; i++){
        A[i+j*w] = 1;
    }
}
for(int j = 0; j < h; j++){
    for(int i = 0; i < w; i++){
        B[i+j*w] = 1;
    }
}
time2 = Timer::instance()->getTime();
txt.Format(_T("Different loops = %f"),time2-time1);
AfxMessageBox(txt);

Ответы [ 3 ]

8 голосов
/ 21 апреля 2011

Это может быть кеш процессора, но, скорее всего, это одновременный доступ к памяти. Когда вы получаете доступ к array1[x], а затем сразу после этого array2[x], это два очень разных места в памяти, и их трудно оптимизировать. Однако array[0], array[1], array[2] и т. Д. Находятся в непрерывной памяти и имеют гораздо более эффективный доступ. Кажется, Intel согласна .

4 голосов
/ 21 апреля 2011

Может потребоваться добавить дополнительный, несвязанный цикл перед началом измерения времени.

2 голосов
/ 21 апреля 2011

Это вопрос кеша. В цикле, где вы получаете доступ как к A, так и к B, процессор вынужден загружать оба в кеш, поэтому в нем содержится меньше элементов каждого массива. В других циклах кэш полон A (или B) элементов, поэтому ошибки в кеше происходят реже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...