Делить в два раза на N быстрее, чем делить на N ^ 2?

Может кто-нибудь ответить, почему это утверждение:

unsigned int index;
unsigned int i;
unsigned int n;
while (condition) {
i = index / n / n;
}

Быстрее чем:

unsigned int index;
unsigned int i;
unsigned int n;
unsigned int n2 = n * n;

while (condition) {
i = index / n2;
}

Очень странно, вот мое видео, демонстрирующее это: [удалено]

Оператор запускается 400 000 раз или заканчивается на 0,15 секунды медленнее. Я очищаю свои .o файлы и переделываю с оптимизацией -O3 каждый раз, когда запускаю тест. Использование gcc (GCC) 4.4.7 20120313 в Red Hat 4.4.7-4

Обновить:

Как и предполагалось, я преобразовал его в сборку, чтобы проверить это. Мои ограниченные знания по сборке не дают ответов, хотя на самом деле кажется, что более быстрое решение должно занять больше времени, потому что больше операций

 128:utils.cpp     ****         i = index / farm_size / farm_size;
1221                   .loc 8 129 0
1222 046a 8B459C           movl    -100(%rbp), %eax
1223 046d BA000000         movl    $0, %edx
1223      00
1224 0472 F7B57CFF         divl    -132(%rbp)
1224      FFFF
GAS LISTING /tmp/cc4vphk8.s             page 44
1225 0478 BA000000         movl    $0, %edx
1225      00
1226 047d F7B57CFF         divl    -132(%rbp)
1226      FFFF
1227 0483 8945B8           movl    %eax, -72(%rbp)
129:utils.cpp     ****         j = (index / farm_size) % farm_size;

.

 128:utils.cpp     ****         i = index / farm_area;
1221                   .loc 8 129 0
1222 046a 8B459C           movl    -100(%rbp), %eax
1223 046d BA000000         movl    $0, %edx
1223      00
1224 0472 F775D8           divl    -40(%rbp)
1225 0475 8945B8           movl    %eax, -72(%rbp)
GAS LISTING /tmp/ccNU8jKx.s             page 44
129:utils.cpp     ****         j = (index / farm_size) % farm_size;

Вот сравнение друг с другом:

http://i.imgur.com/mB4OeFM.png

-1

Решение

В вашем видео есть важная информация, которую вы не включили в код.

Код двойного деления, который работает в 1.15s, показан здесь

введите описание изображения здесь

Код с одним делением, который выполняется в 1.34s, показан здесь:
введите описание изображения здесь

Одно важное отличие, которое неочевидно в опубликованном вопросе, — это набор переменных в вашем цикле.

В более быстром коде у вас есть i, j, k, index, farm_size,

В более медленном коде у вас есть i, j, k, index, farm_size, а также farm_area,

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

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector