Не моя цель - начать микро-оптимизацию, поэтому, если это произойдет, я с радостью напишу вопрос. Но я собираюсь приступить к принятию некоторых проектных решений и хочу быть более информированными.Как влияет структура «упаковки» на производительность
Я читаю и обрабатываю формат файла, который содержит многочисленные структуры данных, которые документированы в четко определенном формате. Я представлял их в коде как структуры.
Теперь, если я упакую structs один 1-байтовый выравнивание с #pragma pack(1)
, я могу читать структуры от потока ввода-вывода непосредственно на указатели на структуру. Это удобно. Если я не упакую структуры, я могу либо fread
полей по одному, либо fread
блоков за один раз и reinterpret_cast
структурных полей один за другим, что, вероятно, будет быстро устаревать.
Для справки, структуры будут прочитаны (потенциально) тысячами и могут иметь некоторое количество хрустов, сделанных на них. Они состоят в основном из неподписанных 16-битных целых чисел (около 60%), 32-битных целых чисел без знака (около 30%) и некоторых 64-битных целых чисел.
Так что вопрос в руке, я могу ...
- Проведение десятков тысяч крошечных звонков
fread
? - Прочитайте фрагменты и скопируйте их по соответствующим байтам?
- Пакет структур и читайте прямо на них?
Единственный правильный ответ: сравнить его. Я бы подумал, что ваш код, скорее всего, связан с IO, и влияние производительности упаковки вашей структуры или нет, не поддается измерению, но без контрольного показателя это просто догадки. –
Он также очень зависит от вашей платформы. На некоторых платформах даже не принимаются нерастянутые чтения/записи, поэтому у вас даже нет возможности упаковывать ваши структуры. Если ваш код должен быть кросс-платформенным, вам не следует путаться с упаковкой вообще. @MarkB также упомянул о предисловии, которое важно помнить тоже. – syam
Поскольку код не знает о платформе, я предполагаю, что упаковка полностью со стола. Угадайте, что оставляет чтение кусков и разрезает его. – user2285060