C ++ 'da performans açısından kritik bazı işler yapıyorum ve şu anda "daha hızlı" olduğu için doğal olarak kayan nokta olan sorunlar için tamsayı hesaplamaları kullanıyoruz. Bu, pek çok can sıkıcı soruna neden olur ve çok sayıda can sıkıcı kod ekler.
Şimdi, kayan nokta hesaplamalarının yaklaşık 386 gün boyunca ne kadar yavaş olduğunu okuduğumu hatırlıyorum, burada (IIRC) isteğe bağlı bir yardımcı işlemci olduğuna inanıyorum. Ama kesinlikle bugünlerde katlanarak daha karmaşık ve güçlü CPU'larla, kayan nokta veya tamsayı hesaplaması yapıyorsanız "hızda" hiçbir fark yaratmıyor mu? Özellikle de gerçek hesaplama süresi, bir ardışık düzen durmasına neden olmak veya ana bellekten bir şey getirmek gibi bir şeye kıyasla çok küçük olduğu için?
Doğru cevabın hedef donanımı karşılaştırmak olduğunu biliyorum, bunu test etmenin iyi bir yolu nedir? İki küçük C ++ programı yazdım ve çalıştırma sürelerini Linux'ta "zaman" ile karşılaştırdım, ancak gerçek çalışma süresi çok değişken (sanal bir sunucuda çalıştırmama yardımcı olmuyor). Bütün günümü yüzlerce kıyaslama yapmak, grafikler yapmak vb. İle harcamak yerine göreceli hızın makul bir testini yapmak için yapabileceğim bir şey var mı? Herhangi bir fikir veya düşünceniz var mı? Tamamen yanılıyor muyum?
Kullandığım programlar şu şekilde, hiçbir şekilde aynı değiller:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
int accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += rand( ) % 365;
}
std::cout << accum << std::endl;
return 0;
}
Program 2:
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <time.h>
int main( int argc, char** argv )
{
float accum = 0;
srand( time( NULL ) );
for( unsigned int i = 0; i < 100000000; ++i )
{
accum += (float)( rand( ) % 365 );
}
std::cout << accum << std::endl;
return 0;
}
Şimdiden teşekkürler!
Düzenleme: İlgilendiğim platform, masaüstü Linux ve Windows makinelerinde çalışan normal x86 veya x86-64.
Düzenleme 2 (aşağıdaki yorumdan yapıştırılmıştır): Şu anda kapsamlı bir kod tabanımız var. Gerçekten, "tamsayı hesaplaması daha hızlı olduğu için şamandırayı kullanmamamız gerektiği" genellemesine karşı çıktım - ve bu genelleştirilmiş varsayımı çürütmek için (eğer bu doğruysa) bir yol arıyorum. Tüm işi yapıp daha sonra profilini çıkarırsak, bizim için kesin sonucu tahmin etmenin imkansız olacağının farkındayım.
Her neyse, mükemmel yanıtlarınız ve yardımlarınız için teşekkürler. Başka bir şey eklemekten çekinmeyin :).
addl
ile değiştirilirfadd
). Gerçekten iyi bir ölçüm elde etmenin tek yolu, gerçek programınızın temel bir parçasını almak ve bunun farklı sürümlerinin profilini çıkarmaktır. Ne yazık ki, tonlarca çaba sarf etmeden bu oldukça zor olabilir. Belki de bize hedef donanımı ve derleyicinizi söylerseniz insanlara en azından size önceden var olan deneyimi vermede yardımcı olur. Tamsayı kullanımınız hakkında,fixed_point
böyle bir işi büyük ölçüde kolaylaştıracak bir tür şablon sınıfı oluşturabileceğinizden şüpheleniyorum .