348
Локальность данных (Data Locality) —
Паттерны программирования игр
буквально уничтожит кэш, и наглядно показать возмож-
ные последствия.
Увидев получившуюся выборку, я удивился. У меня
были предположения, что влияние окажется серьезным,
но не настолько же… Я написал две программы, кото-
рые делали
одно и то же
. Единственная разница в ко-
личестве пропусков кэша. И первый пример оказался
в
пятьдесят
раз медленнее.
Это прямо открыло мне глаза. Я привык думать, что
производительность зависит от
кода
, а не от
данных
.
Байт не является быстрым или медленным, он просто
некая статичная вещь, которая где-то лежит. Но так как
мы используем кэш,
способ организации данных напря-
мую влияет на производительность
.
Оптимизация использования кэша — обширная тема.
Я даже еще не затронул
кэширование инструкций
. Запом-
ните, код тоже располагается в памяти и должен быть
загружен в процессор перед выполнением. Наверное,
кто-то, кто разбирается в этом чуть лучше, мог бы напи-
сать целую книгу.
Раз уж вы читаете
эту
книгу, я поделюсь с вами не-
сколькими базовыми приемами, которые помогут вам
начать думать о данных как о чем-то, влияющем на про-
изводительность.
Все сводится к простой вещи: каждый раз, когда чип
считывает информацию из памяти, он целиком заполня-
ет строку кэш-памяти. И чем больше данных вы може-
те использовать из строки кэш-памяти, тем быстрее бу-
дет работать ваш код. Ваша цель —
организовать ваши
структуры данных таким образом, чтобы обрабаты-
ваемые данные находились в памяти рядом
.
Другими словами, если вы сначала обрабатываете
Thing
, затем
Another
, а потом
Also
, логично располо-
жить их в памяти примерно так (рис. 17.3).
Рис. 17.3.
Три объекта рядом друг с другом в памяти
Конечно, есть подвод-
ные камни. В частности,
у разных компьютеров
по-разному реализован
кэш, так что мои резуль-
таты могут не совпадать
с вашими. А игровые
консоли сильно отлича-
ются от персональных
компьютеров, которые,
в свою очередь, имеют
много отличий от мо-
бильных устройств.
Результаты могут быть
совершенно разными —
это нормально.
На самом деле кое-кто
уже написал книгу
по этой теме:
Data-
Oriented Design
, Ричард
Фабиан.
Тут есть одно важное
допущение — один по-
ток. Если вы обрабаты-
ваете соседние данные
в нескольких потоках,
то
быстрее
будет распо-
ложить их в
разные
кэш-
строки. Если два потока
попытаются обратиться
к данным в одной
строке кэш-памяти,
то обоим ядрам при-
дется заниматься доро-
гостоящей синхрониза-
цией кэша.
Do'stlaringiz bilan baham: |