В книге Game Coding Complete, 3-е издание, автор упоминает методику уменьшения размера структуры данных и для повышения производительности доступа. По сути, это зависит от того факта, что вы получаете производительность, когда переменные-члены выровнены по памяти. Это очевидная потенциальная оптимизация, которой могли бы воспользоваться компиляторы, но, убедившись, что каждая переменная выровнена, они в конечном итоге вздувают размер структуры данных.
Или, по крайней мере, это было его требование.
Реальное повышение производительности, утверждает он, заключается в использовании вашего мозга и обеспечении того, чтобы ваша структура была правильно спроектирована так, чтобы использовать преимущества увеличения скорости при одновременном предотвращении раздувания компилятора. Он предоставляет следующий фрагмент кода:
#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 )
Используя вышеупомянутые struct
объекты в неопределенном тесте, он сообщает об увеличении производительности на 15.6%
(222ms
по сравнению с 192ms
) и меньшем размере для FastStruct
. Все это имеет смысл на бумаге для меня, но не выдерживает моего тестирования:
Результаты того же времени и (считая для char unused[ 2 ]
)!
Теперь, если #pragma pack( push, 1 )
выделен только на FastStruct
(или полностью удален), мы видим разницу:
Итак, наконец, здесь лежит вопрос: оптимизируют ли современные компиляторы (в частности, VS2010) для выравнивания битов, отсюда и отсутствие повышения производительности (но увеличение размера структуры как побочный эффект, как заявил Майк Макшаффри)? Или мой тест недостаточно интенсивен / не дает результатов, чтобы дать какие-либо существенные результаты?
Для тестов я выполнил множество задач от математических операций, обхода / проверки многомерного массива по главному столбцу, матричных операций и т. Д. Для элемента без выравнивания __int64
. Ни одна из них не дала разных результатов ни для одной из структур.
В конце концов, даже если их производительность не увеличилась, это все же полезный трюк, о котором следует помнить, чтобы свести к минимуму использование памяти. Но я был бы рад, если бы был прирост производительности (независимо от того, насколько он незначителен), которого я просто не вижу.