/ / Предимство на производителността от замяна на няколко bools с един int и използване на битово маскиране? - c ++, linux, производителност, оптимизация, битова манипулация

Предимството на ефективността при заместването на няколко була с един int и използването на маскиране на битовете? - c ++, linux, производителност, оптимизация, битова манипулация

Имам приложение C ++, където използвам множествопреодолява, за да провери условията за IF изявления. Използването на cachegrind моят клон неправилно предвиждане е около 4%, така че не е твърде лошо. Все пак трябва да се опитам да увелича ефективността.

Струва ли си да замените 12x bools с един int. Аз съм на 64-битов Red Hat и вярвам, че bools са представени с помощта на 4-байтови входове. Затова използвам 48 байта, а не 12 бита.

Ако използвах битово маскиране, мисля, че все пак бих го направилтрябва да съхранявате битови модели за достъп до конкретни битове в общия инт. Дали нуждата от съхранение на тези битови модели компенсира байтовете, спестява от намаляване на броя пулове и следователно би направила тази идея безсмислена?

Отговори:

1 за отговор № 1

Въпреки че единственият начин да разберете със сигурност е да го изпробвате, има няколко съображения, които могат да повлияят на вашето решение.

Първо, обемът на съхранението ще намалее: не би трябвало да „съхранявате битови модели за достъп до конкретни битове в цялост int", защото тези модели ще станат константи във вашата програма" изпечени "в двоичния код.

Второ, трябва да погледнете модела на използване на вашите знамена. Ако често проверявате комбинации от няколко флага, е възможно да замените някои от тези проверки с една маскираща операция.

Трето, трябва да разгледате аспекта на връщане на данните обратно: с отделни bool стойности всяко записване отива на собственото си местоположение, докаторешение със знамена би било писане на един и същ байт или два всеки път, когато трябва да модифицирате вашите флагове. От друга страна, промяната на няколко знамена наведнъж може да се извърши с едно записване.

И накрая, трябва да помислите за въпроса зачетимост: вашата програма е длъжна да стане по-сложна след тази промяна. Печалбите от производителността може да са твърде малки в сравнение със загубите за четене, защото кодът ще работи по-бързо, когато хардуерът стане по-бърз след няколко години, но по-малко четим код ще остане по-малко четим завинаги.


0 за отговор № 2

Единственото решение, което трябва да знаете със сигурност, е профилирането. Използването на ints може дори да е по-бавно в някои архитектури, тъй като достъпът до единични битове може да включва известно изместване на бита и маскиране.