Итак, нам нужно инкрементировать массив элементов(увеличить каждое его значение на n)

Обычно это выглядит так

Ннно, в современных процессорах есть векторные юниты… вообщем проще вики копирнуть

SIMD  (англ. single instruction, multiple data —  одиночный поток команд, множественный поток данныхОКМД ) — принцип компьютерных вычислений, позволяющий обеспечить параллелизм на уровне данных. Один из классов вычислительных систем в классификации Флинна.

SIMD-компьютеры состоят из одного командного процессора (управляющего модуля), называемого контроллером, и нескольких модулей обработки данных, называемых процессорными элементами. Управляющий модуль принимает, анализирует и выполняет команды. Если в команде встречаются данные, контроллер рассылает на все процессорные элементы команду, и эта команда выполняется на нескольких или на всех процессорных элементах. Каждый процессорный элемент имеет свою собственную память для хранения данных. Одним из преимуществ данной архитектуры считается то, что в этом случае более эффективно реализована логика вычислений. До половины логических инструкций обычного процессора связано с управлением выполнением машинных команд, а остальная их часть относится к работе с внутренней памятью процессора и выполнению арифметических операций. В SIMD-компьютере управление выполняется контроллером, а «арифметика» отдана процессорным элементам.

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

Тк воооот, зная это, можно выполнить оптимизацию путем векторизации, тоесть загрузить эти самые регистры роботой:
Было:

Стало:

То есть теперь мы итерируем не по одному эл массива, а сразу по 4  (i+=4 вместо i++)
и чтобы не прибавить а к несуществующим элементам i<arr.length-4

(тоесть вот нам пришел массив из 10, произойдет 3 итерации 0,4,8 прибавляем числа мы к след 4 зачением, тоесть 0,1,2,3; 4,5,6,7; 8,9,10,11 это будет выглядеть так

Произошло прибавление а к несуществующим элементам, то есть к рандомным участкам памяти, что не есть хорошо, но программа не вылетает потому что gcc немного умный

Это было объяснение почему не вылетает с i<arr.length без -4;)

Нам надо доитерировать остаток массива от деления на 4, тоесть из 10 мы проитерировали первые 8, осталось 9 10

Ну а теперь только замерить время обычного способа и с оптимизацией.

Итак массив из 999999 заполняем рандомом, засекаем время, инкрементируем, смотрим скоко времени прошло:

значит в среднем чето около 7к микросекунд

Теперь закоментим обычный способ и раскоментим тот который складывает по 4 за раз, а потом остаток:

Разница очевидна:

теперь среднее на глаз 3,5 что в два раза быстрее.

Попробуем прибавлять не по 4 за раз а по 8, вдруг этих регистров там многа)

Прирост поменьше, но он есть

Думаю продолжить эксперементы сможете сами, «а на сегодня все, до новых встреч»