Почему мы промаха кэша в первой версии?
Как Оли указывает на комментарии. Этот вопрос необоснован. Если данные уже находятся в кеше, то промахов в кеше не будет.
В стороне, нет разницы в доступе к памяти между двумя примерами. Таким образом, это вряд ли будет фактором в любой разнице в производительности между ними.
Есть ли у второй версии лучшая производительность, чем первая? Зачем ?
Как правило, дело в том, чтобы на самом деле измерить. Но в этом конкретном примере я бы сказал, что он, скорее всего, будет быстрее. Не из-за лучшего доступа к кешу, а из-за разворачивания цикла.
Оптимизация, которую вы выполняете, называется «Разделение узлов», где вы разделяете переменную counter
с целью разбить цепочку зависимостей.
Однако в этом случае вы выполняете операцию тривиального сокращения. Многие современные компиляторы могут распознать этот шаблон и сделать это разделение узлов для вас.
Так это быстрее? Скорее всего. Но вы должны проверить, не делает ли компилятор для вас.
Для записи: я только проверил это на Visual Studio 2010.
И я очень удивлен, что это не в состоянии сделать эту оптимизацию.
; 129 :
; 130 : int counter = 0;
; 131 :
; 132 : for (int i=0; i<n; i++)
mov ecx, DWORD PTR n$[rsp]
xor edx, edx
test ecx, ecx
jle SHORT [email protected]
[email protected]:
; 133 : {
; 134 : counter += myArray[i];
add edx, DWORD PTR [rax]
add rax, 4
dec rcx
jne SHORT [email protected]
[email protected]:
; 135 : }
Visual Studio 2010, кажется, не способен выполнять «Node Нарезка» для этого (тривиальный) пример ...
Что заставляет вас думать, что есть кэш-промах в первой версии? – templatetypedef
Я не уверен, что будет много разницы ... –
Пахнет как домашнее задание слишком много ... – m0skit0