Evet. Ne kadar söyleyemem olsa da. Bunu belirlemenin en kolay yolu, onu karşılaştırmaktır.
pow
işlevi, ikilileri kullanır ... En azından, C standardına uyuyorsa. o 2
bir üs gördüğünde o fonksiyonu bitshift kullanılan bile, yine de test ve basit bitshift tamamlanacağı hangi zaman bu sonuca ulaşmak dallanma olacaktı. Ve henüz bir fonksiyon çağrısının daha fazlasını düşünmedik bile.
Eşdeğerlik için 1 << 4
yerine 1 << x
kullanmak istediğinizi varsayalım.
Belki de bir derleyici bunların her ikisini de optimize edebilir, ancak bir aramayı pow
numaralı telefona göre optimize etme olasılığı o kadar düşüktür. 2'nin gücünü hesaplamanın en hızlı yoluna ihtiyacınız varsa, bunu değiştirerek yapın.
Güncelleme ... Değinilmesi kolay olduğundan bahsettiğimden, bunu yapmaya karar verdim. Windows ve Visual C++ kullanışlıdır, bu yüzden bunu kullandım. Sonuçlar değişecektir. Programım:
#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;
}
Benim çıkışı:
379.466 ms
15.862 ms
Sum power: 157650768
Sum shift: 157650768
Time ratio of pow versus shift: 23.92
Bunu denediniz mi? –
"O kadar" ne kadar? Daha az verimli olmasını beklemelisiniz, aksi takdirde soruyu sormazsınız. Öyleyse burada sahip olduğumuz şey, akıl almayı umduğumuz araştırmalarda hiçbir girişimde bulunmadan, anlamsız bir sorudur.-1 –
Bunu beklediğimden değildi, birisi bir pow (2, x); Kodumda vardı ve "her zaman 2'nin güçleri yerine biraz değişiyor" dedim ve daha önce hiç duymamıştım, bu yüzden buradaki soruyu burada sordum. – patrick