Может кто-нибудь ответить, почему это утверждение:
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;
Вот сравнение друг с другом:
В вашем видео есть важная информация, которую вы не включили в код.
Код двойного деления, который работает в 1.15s, показан здесь
Код с одним делением, который выполняется в 1.34s, показан здесь:
Одно важное отличие, которое неочевидно в опубликованном вопросе, — это набор переменных в вашем цикле.
В более быстром коде у вас есть i
, j
, k
, index
, farm_size
,
В более медленном коде у вас есть i
, j
, k
, index
, farm_size
, а также farm_area
,
Таким образом, даже при том, что вы делаете на одно деление меньше, вы перемещаетесь вокруг большего количества переменных, что стоит вам дополнительного времени.
Других решений пока нет …