Comments 2
Для корректности теста автовекторизацию лучше выключить настройками компилятора. А еще неплохо бы посчитать флопсы и Гб/с.
Насчет кэш промахов при случайном доступе нужно считать Гб/с и сравнивать с аналогичным memcpy, тогда будет видно сколько реально идет в RAM, а сколько в кэши. Ничего не мешает ЦП читать массив индексов наперед и префетчить, потери идут только из-за прыгания по кэш линиям из-за чего железо не успевает подгружать данные, а была бы память побыстрее, то и потерь не было бы.
Спасибо, хорошая статья, особенно последний вывод - нет универсального оптимального решения, оптимум зависит от вашей архитектуры данных и операций над ними.
Еще стоит отметить, что SoA может быть эффективнее в ряде случаев, если сгруппировать XYZ в структуру и сделать массив таких структур. Это должно улучшить ситуацию со случайным доступом к примеру.
Все же обычно мы делаем массовые операции с вектором целиком, а не с его компонентом.
Принципы DOD в C++: Часть 2. AoS, SoA. Мнимая панацея для быстродействия