Sto eseguendo un lavoro critico per le prestazioni in C ++ e attualmente stiamo utilizzando calcoli interi per problemi che sono intrinsecamente in virgola mobile perché "è più veloce". Ciò causa molti fastidiosi problemi e aggiunge molto codice fastidioso.
Ora, ricordo di aver letto di come i calcoli in virgola mobile fossero così lenti all'incirca nei 386 giorni, in cui credo (IIRC) che ci fosse un co-processore opzionale. Ma sicuramente al giorno d'oggi con CPU esponenzialmente più complesse e potenti non fa differenza di "velocità" fare calcoli in virgola mobile o interi? Soprattutto dal momento che il tempo di calcolo effettivo è minimo rispetto a qualcosa come causare un blocco della pipeline o recuperare qualcosa dalla memoria principale?
So che la risposta corretta è eseguire il benchmark sull'hardware di destinazione, quale sarebbe un buon modo per testarlo? Ho scritto due minuscoli programmi C ++ e ho confrontato il loro tempo di esecuzione con il "tempo" su Linux, ma il tempo di esecuzione effettivo è troppo variabile (non aiuta se sto eseguendo su un server virtuale). A parte passare la mia intera giornata eseguendo centinaia di benchmark, facendo grafici ecc., C'è qualcosa che posso fare per ottenere un test ragionevole della velocità relativa? Qualche idea o pensiero? Mi sbaglio completamente?
I programmi che ho usato come segue, non sono affatto identici:
#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;
}
Programma 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;
}
Grazie in anticipo!
Modifica: la piattaforma che mi interessa è la normale x86 o x86-64 in esecuzione su computer desktop Linux e Windows.
Modifica 2 (incollato da un commento di seguito): attualmente disponiamo di un'ampia base di codice. In realtà mi sono scontrato con la generalizzazione che "non dobbiamo usare il float poiché il calcolo dell'intero è più veloce" - e sto cercando un modo (se questo è anche vero) per confutare questa ipotesi generalizzata. Mi rendo conto che sarebbe impossibile prevedere il risultato esatto per noi se non fare tutto il lavoro e profilarlo in seguito.
Comunque, grazie per tutte le tue eccellenti risposte e aiuto. Sentiti libero di aggiungere qualcos'altro :).
float
ottiene l'aumento di velocità, ma di solito double
no.
addl
sostituito confadd
, ad esempio). L'unico modo per ottenere davvero una buona misurazione è ottenere una parte fondamentale del tuo programma reale e profilarne diverse versioni. Sfortunatamente può essere piuttosto difficile senza usare un sacco di sforzi. Forse dirci l'hardware di destinazione e il tuo compilatore aiuterebbe le persone a darti almeno un'esperienza preesistente, ecc. Riguardo al tuo uso intero, sospetto che potresti creare una sorta difixed_point
classe modello che faciliterebbe enormemente tale lavoro.