Saya melakukan beberapa pekerjaan penting kinerja di C ++, dan kami saat ini menggunakan perhitungan integer untuk masalah yang secara inheren floating point karena "lebih cepat". Ini menyebabkan banyak masalah yang mengganggu dan menambahkan banyak kode yang mengganggu.
Sekarang, saya ingat pernah membaca tentang bagaimana penghitungan floating point sangat lambat kira-kira sekitar 386 hari, di mana saya percaya (IIRC) bahwa ada ko-prosesor opsional. Tapi tentunya saat ini dengan CPU yang secara eksponensial lebih kompleks dan bertenaga tidak ada perbedaan dalam "kecepatan" jika melakukan perhitungan floating point atau integer? Terutama karena waktu kalkulasi yang sebenarnya sangat kecil dibandingkan dengan sesuatu seperti menyebabkan pipa berhenti atau mengambil sesuatu dari memori utama?
Saya tahu jawaban yang benar adalah dengan melakukan benchmark pada perangkat keras target, cara apa yang baik untuk menguji ini? Saya menulis dua program C ++ kecil dan membandingkan waktu berjalannya dengan "waktu" di Linux, tetapi waktu proses sebenarnya terlalu bervariasi (tidak membantu saya menjalankan di server virtual). Tanpa menghabiskan seluruh hari saya menjalankan ratusan tolok ukur, membuat grafik, dll. Adakah yang dapat saya lakukan untuk mendapatkan pengujian kecepatan relatif yang wajar? Ada ide atau pemikiran? Apakah saya sepenuhnya salah?
Program yang saya gunakan sebagai berikut, sama sekali tidak identik:
#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;
}
Terima kasih sebelumnya!
Sunting: Platform yang saya pedulikan adalah x86 atau x86-64 biasa yang berjalan di desktop Linux dan mesin Windows.
Edit 2 (ditempelkan dari komentar di bawah): Saat ini kami memiliki basis kode yang luas. Sungguh saya telah menentang generalisasi bahwa kita "tidak boleh menggunakan float karena perhitungan integer lebih cepat" - dan saya sedang mencari cara (jika ini benar) untuk menyangkal asumsi umum ini. Saya menyadari bahwa tidak mungkin untuk memprediksi hasil yang tepat bagi kami tanpa melakukan semua pekerjaan dan membuat profil setelahnya.
Bagaimanapun, terima kasih atas semua jawaban dan bantuan Anda yang luar biasa. Jangan ragu untuk menambahkan yang lain :).
float
mendapat peningkatan kecepatan, tetapi biasanya double
tidak.
addl
diganti denganfadd
, misalnya). Satu-satunya cara untuk benar-benar mendapatkan pengukuran yang baik adalah mendapatkan bagian inti dari program Anda yang sebenarnya dan membuat profil versi yang berbeda dari itu. Sayangnya itu bisa sangat sulit tanpa menggunakan banyak usaha. Mungkin memberitahu kami target perangkat keras dan kompiler Anda akan membantu orang setidaknya memberi Anda pengalaman yang sudah ada sebelumnya, dll. Tentang penggunaan integer Anda, saya curiga Anda bisa membuat semacamfixed_point
kelas template yang akan sangat memudahkan pekerjaan seperti itu.