Yes. Although, as far as I can not say. The easiest way to determine this is to compare it.
The pow function uses doubles ... At least if it conforms to the C standard. Even if this function used a bit shift, when it sees base 2 , there will still be testing and branching to achieve this output, and by that time your simple bit record It will be completed. And we have not yet considered the overhead of calling a function.
For equivalence, I assume that you used 1 << x instead of 1 << 4 .
Perhaps the compiler can optimize both of them, but much less often optimize the pow call. If you need the fastest way to calculate power 2, do it with a shift.
Update ... Since I mentioned that this is easy to compare, I decided to do just that. I happen to have Windows and Visual C ++, so I used this. The results will be different. My program:
#include <Windows.h> #include <cstdio> #include <cmath> #include <ctime> LARGE_INTEGER liFreq, liStart, liStop; inline void StartTimer() { QueryPerformanceCounter(&liStart); } inline double ReportTimer() { QueryPerformanceCounter(&liStop); double milli = 1000.0 * double(liStop.QuadPart - liStart.QuadPart) / double(liFreq.QuadPart); printf( "%.3f ms\n", milli ); return milli; } int main() { QueryPerformanceFrequency(&liFreq); const size_t nTests = 10000000; int x = 4; int sumPow = 0; int sumShift = 0; double powTime, shiftTime; // Make an array of random exponents to use in tests. const size_t nExp = 10000; int e[nExp]; srand( (unsigned int)time(NULL) ); for( int i = 0; i < nExp; i++ ) e[i] = rand() % 31; // Test power. StartTimer(); for( size_t i = 0; i < nTests; i++ ) { int y = (int)pow(2, (double)e[i%nExp]); sumPow += y; } powTime = ReportTimer(); // Test shifting. StartTimer(); for( size_t i = 0; i < nTests; i++ ) { int y = 1 << e[i%nExp]; sumShift += y; } shiftTime = ReportTimer(); // The compiler shouldn't optimize out our loops if we need to display a result. printf( "Sum power: %d\n", sumPow ); printf( "Sum shift: %d\n", sumShift ); printf( "Time ratio of pow versus shift: %.2f\n", powTime / shiftTime ); system("pause"); return 0; }
My conclusion:
379.466 ms 15.862 ms Sum power: 157650768 Sum shift: 157650768 Time ratio of pow versus shift: 23.92
paddy
source share