Задать вопрос
@Acaunt

Что быстрее индексы или указатели?

Допустим у меня есть следующие переменные:
int a[N] = { случайные числа };
int b[N] = { случайные числа };
int c[N];


Какой код будет выполняться быстрее?

С помощью индекса:
for (size_t i = 0; i < N; ++i) {
c[i] = (b[i] == 0) ? b[i] : (a[i] / b[i]);
}


Или с помощью указателей
int* it_a = a;
int* it_b = b;
for (auto& it_c : c) {
it_c = (*it_b == 0) ? *it_b : (*it_a / *it_b);
++it_a;
++it_b;
}


Пока я склоняюсь к тому, что указатели быстрее, так как в отличие от индексов не происходит постоянное складывание с указателем массива.

Я пробовал проводить тесты на компьютере, но у меня не достаточно памяти для тестов с большими массивами, а то что я пробовал разница в 1-2 мс, в пользу указателей, или вообще равны.
  • Вопрос задан
  • 310 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Зависит от модели процессора, версии и опций компилятора и немножечко фазы луны. В целом без разницы.

Практический совет - лучше писать через индексы, ибо так понятнее и больше шансов что компилятор там все наоптимизирует (например, он сможет векторизовать работу через какие-нибудь SSE инструкции процессора).

Совет по бенчмарку - если памяти не хватает, стоит по одному достаточно большому массиву пройтись 10000 раз. А лучше использовать готовые фреймворки для измерения скорости, вроде того де gbenchmark.

Еще, иногда полезно посмотреть на ассемблерный выхлоп. Вот, например, что происходит при -O3 опции компилятора. Он генерирует вообще идентичный код для обеих функций (развернув циклы)! И даже при -O2 оно одинаковый код выдает.

Без оптимизаций код разный, но там все не так как вы думаете. Вместо инструкции mov eax, dword ptr [rax + 4*rcx] в варианте с индексами используется инструкция mov eax, dword ptr [rax] для указателей. Это самое "складывание с указателем массива" вообще не отдельная операция - а вариант адрессации в инструкции mov. Они могут вообще одинаковое количество тактов занимать, это надо мануал по конкретной архитектуре процессоров читать.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы