Выравнивание битов для увеличения пространства и производительностиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Выравнивание битов для увеличения пространства и производительности

Сообщение Anonymous »

В книге Game Coding Complete, 3rd Edition автор упоминает метод, позволяющий уменьшить размер структуры данных и повысить производительность доступа. По сути, он основан на том факте, что вы получаете повышение производительности, когда переменные-члены выравниваются по памяти. Это очевидная потенциальная оптимизация, которой могли бы воспользоваться компиляторы, но, гарантируя, что каждая переменная выровнена, они в конечном итоге увеличивают размер структуры данных.

Или это было по крайней мере, по его утверждению.

Реальное повышение производительности, утверждает он, достигается за счет использования вашего мозга и обеспечения того, чтобы ваша структура была правильно спроектирована, чтобы использовать преимущества увеличения скорости, одновременно предотвращая компилятор раздувается. Он предоставляет следующий фрагмент кода:

Код: Выделить всё

#pragma pack( push, 1 )

struct SlowStruct
{
char c;
__int64 a;
int b;
char d;
};

struct FastStruct
{
__int64 a;
int b;
char c;
char d;
char unused[ 2 ]; // fill to 8-byte boundary for array use
};

#pragma pack( pop )
Используя приведенные выше объекты структуры в неопределенном тесте, он сообщает об увеличении производительности на 15,6% ( по сравнению с 192 мс) и меньший размер FastStruct. Для меня все это имеет смысл на бумаге, но не выдерживает моих тестов:

[img]https:/ /i.sstatic.net/Gf6yK.png[/img]


Результаты в одно и то же время и размера (с учетом неиспользуемого символа[ 2 ]< /код>)!

Теперь, если пакет #pragma( push, 1 ) изолировать только от FastStruct (или полностью удалить), мы увидим разницу:

Изображение


Итак наконец, здесь возникает вопрос: делают ли современные компиляторы (В частности, VS2010) уже оптимизировано для выравнивания битов, отсюда и отсутствие увеличения производительности (но увеличение размера структуры как побочный эффект, как заявил Майк Макшаффри)? Или мой тест недостаточно интенсивен/недостоверен, чтобы дать какие-либо значимые результаты?

Для тестов я выполнял различные задачи, начиная от математических операций и заканчивая многомерным массивом по столбцам. перемещение/проверка, матричные операции и т. д. с невыровненным элементом __int64. Ничто из этого не дало разных результатов ни для одной из структур.

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

Подробнее здесь: https://stackoverflow.com/questions/908 ... nce-boosts
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»