Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it fastest to access a byte than a bit? Why?

The question is very straight: is it fastest to access a byte than a bit? If I store 8 booleans in a byte will it be slower when I have to compare them than if I used 8 bytes? Why?

like image 317
WindScar Avatar asked Oct 16 '11 03:10

WindScar


3 Answers

Chances are no. The smallest addressable unit of memory in most machines today is a byte. In most cases, you can't address or access by bit.

In fact, accessing a specific bit might be even more expensive because you have to build a mask and use some logic.

EDIT:

Your question mentions "compare", I'm not sure exactly what you mean by that. But in some cases, you perform logic very efficiently on multiple booleans using bitwise operators if your booleans are densely packed into larger integer types.

As for which to use: array of bytes (with one boolean per byte), or a densely packed structure with one boolean per bit is a space-effiicency trade-off. For some applications that need to store a massive amount of bools, dense packing is better since it saves memory.

like image 167
Mysticial Avatar answered Oct 05 '22 06:10

Mysticial


The underlying hardware that your code runs on is built to access bytes (or longer words) from memory. To read a bit, you have to read the entire byte, and then mask off the bits you don't care about, and possibly also shift to get the bit into the ones position. So the instructions to access a bit are a superset of the instructions to access a byte.

like image 29
Ned Batchelder Avatar answered Oct 05 '22 05:10

Ned Batchelder


It may be faster to store the data as bits for a different reason - if you need to traverse and access many 8-bit sets of flags in a row. You will perform more ops per boolean flag, but you will traverse less memory by having it packed in fewer bytes. You will also be able to test multiple flags in a single operation, although you may be able to do this with bools to some extent as well, as long as they lie within a single machine word.

The memory latency penalty is far higher than register bit twiddling. In the end, only profiling the code on the hardware on which it will actually run will tell you which way is best.

like image 38
Michael Goldshteyn Avatar answered Oct 05 '22 05:10

Michael Goldshteyn