Čelíte klasickému kompromisu v časové paměti. Bitová pole budou v paměti menší, ale jejich provoz bude trvat déle. Můžete spočítat, že bez ohledu na to, jaký procesor, bitová pole budou pomalejší.
Používáte slovo efektivní , ale toto slovo nemá určitý význam bez metriky toho, co je dobré nebo špatné. Pokud máte pouze 8 k RAM, je používání paměti špatné, čas může být levný. Pokud máte omezení v reálném čase, pak je používání času špatné a paměť může být levná. Obecně si z tohoto kompromisu můžete koupit pouze cestu ven. Jinými slovy, když zjistíte, že je čas i paměť špatné, utratte hotovost a použijte větší čip. Neexistuje jediná odpověď na to, co je dobré nebo špatné. To je část toho, proč existuje tolik možností pro mikrokontroléry, že lidé přizpůsobí čip aplikaci a aplikaci na čip.
Naplnění bitů bitového pole bude pomalejší než vyplňování úplných bajtů. Vezměte například
x = 5; ... asimplestruct.len = x; // vsabitfield.len = x;
První jednoduchý případ bude jen:
- načíst hodnotu x do registru
- uložit ji do bajtu pro len
Druhý způsobí něco jako:
- načte aktuální hodnotu abitfieldu
- načte masku
- vymaže bity pro len
- načte aktuální hodnotu x
- načte masku
- vymaže nepoužité bity x
- posune bity x
- nebo x s abitfieldem
- ukládá aktuální hodnotu zpět do paměti
Pokud všechny vaše operace shromažďují data do bitového pole nebo se rozbalují z bitového pole, měli byste očekávat pomalejší provádění. Bitová pole jsou typem komprese - stojí za zaškrtnutí.
Ale pohyb po bitových polích bude rychlejší, protože je třeba načíst a uložit méně bytů. Pokud budete toto pole třídit, může být výhodou menší počet bajtů. Pokud je přenášíte přes sériový port, může být vítězem komprimovaná velikost bitového pole.
Takže s ohledem na vaši otázku:
Existuje dobrý způsob, jak to otestovat?
Jediným dobrým způsobem, jak to otestovat, je psát testovací případy pro oba přístupy pomocí vzoru, který úzce odpovídá vaší aplikaci. Opravdu záleží na tom, jakou kombinaci operací provádíte, abyste se rozhodli, zda je rozdíl zanedbatelný nebo významný.
Když provádíte tento druh optimalizačního experimentu, rozhodně použijte u svého projektu řízení zdroje. Místní úložiště GIT nebo Mercurial můžete vytvořit pouhými několika kliknutími. Udržování řetězce kontrolních bodů vám umožní roztrhat váš kód a zkoumat účinky různých implementací. Pokud uděláte špatnou zatáčku, úložiště vám umožní jednoduše se vrátit k poslednímu dobrému bodu a zkusit jinou cestu.
(Poznámka na straně: Tentokrát existuje i kompromis paměti v opačném směru. Pokud se podíváte prostřednictvím možností kompilátoru pro procesory třídy pro stolní počítače najdete něco, co se nazývá strukturované balení . Tato možnost vám umožní přidat prázdné bajty mezi jednobajtová pole tak, aby zůstaly zarovnány na hranici slova nebo dvojitého slova. vypadat šíleně, že úmyslně vyhodí RAM, ale na procesorech s 16 nebo 32 bitovými širokými registry a sběrnicemi mohou být takzvané operace paměti zarovnané na slovo nebo dword rychlejší než operace po bajtech.