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

-3

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

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

спросил(а) 2014-02-04T03:46:00+04:00 6 лет назад
0
70

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

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

enter image description here

Здесь показан код с одним делением, который работает в 1,34 секунды: enter image description here

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

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

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

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

ответил(а) 2014-02-04T04:08:00+04:00 6 лет назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема