Wykonuję pewne prace krytyczne dla wydajności w C ++ i obecnie używamy obliczeń całkowitych do problemów, które są z natury zmiennoprzecinkowe, ponieważ „jest szybsze”. Powoduje to wiele irytujących problemów i dodaje dużo irytującego kodu.
Pamiętam, jak czytałem o tym, jak obliczenia zmiennoprzecinkowe były tak powolne przez około 386 dni, kiedy wierzę (IIRC), że istniał opcjonalny współprocesor. Ale z pewnością w dzisiejszych czasach, przy wykładniczo bardziej złożonych i wydajnych procesorach, nie ma różnicy w szybkości, jeśli wykonujesz obliczenia zmiennoprzecinkowe lub całkowite? Zwłaszcza, że faktyczny czas obliczeń jest niewielki w porównaniu z czymś takim, jak spowodowanie zablokowania rurociągu lub pobranie czegoś z pamięci głównej?
Wiem, że poprawną odpowiedzią jest test porównawczy na sprzęcie docelowym. Jaki byłby dobry sposób na przetestowanie tego? Napisałem dwa malutkie programy w C ++ i porównałem ich czas pracy z „czasem” w Linuksie, ale rzeczywisty czas wykonywania jest zbyt zmienny (nie pomaga, gdy pracuję na serwerze wirtualnym). Oprócz spędzenia całego dnia na wykonywaniu setek testów porównawczych, tworzeniu wykresów itp., Czy jest coś, co mogę zrobić, aby uzyskać rozsądny test względnej prędkości? Jakieś pomysły lub przemyślenia? Czy całkowicie się mylę?
Programy, których użyłem w następujący sposób, nie są w żaden sposób identyczne:
#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;
}
Z góry dziękuję!
Edycja: Platforma, na której mi zależy, to zwykła x86 lub x86-64 działająca na komputerach stacjonarnych z systemem Linux i Windows.
Edycja 2 (wklejona z komentarza poniżej): Obecnie mamy obszerną bazę kodu. Naprawdę spotkałem się z uogólnieniem, że „nie wolno używać liczby zmiennoprzecinkowej, ponieważ obliczanie liczb całkowitych jest szybsze” - i szukam sposobu (jeśli to w ogóle prawda), aby obalić to uogólnione założenie. Zdaję sobie sprawę, że niemożliwe byłoby przewidzenie dokładnego wyniku dla nas bez wykonania całej pracy i późniejszego sprofilowania.
W każdym razie dziękuję za wszystkie doskonałe odpowiedzi i pomoc. Zapraszam do dodania czegoś jeszcze :).
addl
zastąpionafadd
na przykład). Jedynym sposobem na uzyskanie naprawdę dobrego pomiaru jest zdobycie podstawowej części swojego prawdziwego programu i przedstawienie jego różnych wersji. Niestety może to być dość trudne bez dużego wysiłku. Być może poinformowanie nas o docelowym sprzęcie i kompilatorze pomogłoby ludziom przynajmniej dać ci wcześniejsze doświadczenie, itp. Jeśli chodzi o używanie liczb całkowitych, podejrzewam, że mógłbyś stworzyć rodzajfixed_point
klasy szablonów, która ogromnie ułatwiłaby taką pracę.