Pull to refresh

Эффективность C++ на современных ПК

Reading time 2 min
Views 3.6K
В виду ограничения на размер, публикую заметку в виде статьи, а не как ссылку с аннотацией.

Со времён, когда проектировался С++, относительная (к скорости оперативной памяти) скорость процессора выросла в 400 раз. Плюс к тому, у процессора появились большие кэши и предсказание ветвлений в коде. Всё это вместе самым серьёзным образом сказывается на эффективности С++ на современных платформах. Ниже даю аннотацию и пару ссылок, где предлагается использовать эти факты для повышения эффективности кода.


Постановка задачи была встречена мною вот в этой статье:
solid-angle.blogspot.com/2010/02/musings-on-data-oriented-design.html

Рекомендую также внимательно ознакомиться с докладом и статьями, ссылки на которые публикует автор в начале. Доклад наиболее информативен и показателен в плане конкретных цифр:
research.scee.net/files/presentations/gcapaustralia09/Pitfalls_of_Object_Oriented_Programming_GCAP_09.pdf
На примере объектов трёхмерной графики показано, как простейшими с точки зрения С++ изменениями (например перераспределение объявлений в заголовке класса) получено серьёзное повышение скорости работы кода.

Автор статьи говорит о необходимости создавать код на основе данных, а уже потом абстракций ООП (Data-Oriented design). С учётом изменившейся разницы в быстродействии памяти и процессора (напоминаю: в сотни раз!), это может глобально ускорить работу кода на современных системах. Если говорить простым языком, подход предлагает:
1) отказ от функций, работающих с единственным элементом данных в тех случаях, где подобных элементов много
2) организацию этих элементов в качестве отдельного непрерывного массива в памяти, плюс функций-членов, работающих непосредственно с этим массивом.

С точки зрения ПК, как пишут авторы, информация разных видов должна быть организована в гомогенные массивы, по одному на каждый тип данных. На уровне ассемблера (либо другого низкоуровневого языка) функции должны быть сгенерированы таким образом, что единицей обработки должен быть массив или их набор. При этом, для человека (например, в ходе отладки), эти данные должны быть сгруппированы по классам (т.е. обычным для современного С++ образом), данные которых представляют собой гетерогенный набор элементов низкоуровневых гомогенных массивов. Это может ускорить работу кода на порядок (или больше в отдельных случаях).

P.S. Для некоторых понятие data-oriented design может оказаться не новым. Вполне возможно, у Вас есть опыт реализации данного подхода и конкретные результаты его применения. Было бы очень интересно, если бы Вы поделились своим опытом подобной оптимизации в комментариях.
Tags:
Hubs:
+37
Comments 49
Comments Comments 49

Articles