Recently I had a question on the interview – I was asked to compare bitwise operations in performance terms.
Like, give a brief description of the performance of different bit operations.
I guess this question could is pretty general and pretty machine-specific, but I also think there should be some general rules about this, which you have to mention (and I didn’t :).
So – what would you answer?
I probably should also say, that it may be a good idea to compare their performance in C (or C++, whatever), because I assume that these languages give more space for the compiler to perform bit-related optimizations.
Thank you.
Okay, the full problem context.
The interview had several sections and some of them were really a piece of cake, some were a nightmare. Bit-related section was kind of tough and including the questions like:
-
Floating point number specifications,
float,double -
Fast
float->intconversions (and even faster one if you know the range)
Those weren’t very tough, but as the last question in this bit-related section I was asked to enumerate bit operations I know and compare their performance.
I answered something not really descriptive like “it’s architecture, compiler, … specific, it won’t actually matter, bitwise is already pretty low-level”, but I guess this answer sucks.
I would imagine they mean comparing bit operations to arithmetic equivalents.
For example, “is
a = (a>>1)faster thana = (a / 2)?”In many cases, simple operations like this will (for various reasons including software and hardware optimisations, pipelining, caching, etc) effectively take 1 CPU cycle, so on modern processors you are unlikely to see a difference – but if they run many instructions in parallel through multiple ALUs then you may still benefit from better utilisation of the CPU’s parallel pathways if you mix arithmetic and bitwise operations. If you write in a higher level language then the compiler is very likely to optimise your code to use whatever is the better form, so you’ll see the same performance regardless of which way you write your code!
However, there are cases where bitwise operations can be significantly faster than simple arithmetic/logic – for example, you can apply some operations to all the bytes in a 32-bit or 64-bit value with a few bitwise operations (that effectively process all the bytes simultaneously), which would otherwise take a lot of looping and comparing logic to do incrementally. See here for some great examples of what can be achieved. In these cases there is often a significant performance benefit to be gained. (although the exact gain can depend a lot on the CPU you’re targeting)
(Alternatively, they may have just meant “is a shift operation faster than an XOR”, in which case with modern processors in most cases the answer is probably “no” – most bitwise operations are quick. But that would be a pretty pointless question to ask…)