Я роблю деяку критичну роботу на C ++, і зараз ми використовуємо цілі обчислення для проблем, які за своєю суттю є плаваючою точкою, оскільки "це швидше". Це викликає цілу масу роздратованих проблем і додає багато дратівливого коду.
Тепер я пам'ятаю, як читав про те, як обчислення з плаваючою точкою були настільки повільними приблизно за 386 днів, де я вважаю (IIRC), що був необов'язковий співпроцесор. Але, безумовно, сьогодні з експоненціально більш складними та потужними процесорами це не має ніякої різниці в "швидкості", якщо робити обчислення з плаваючою точкою або цілим числом? Тим більше, що фактичний час обчислення невеликий порівняно з чимось на кшталт того, що викликає затримку трубопроводу або витягнення чогось із основної пам'яті?
Я знаю, що правильна відповідь - це орієнтир на цільовому обладнання, який би був хороший спосіб перевірити це? Я написав дві крихітні програми C ++ і порівняв їх час роботи з "часом" на Linux, але фактичний час роботи занадто мінливий (це не допомагає мені працювати на віртуальному сервері). Якщо не витрачати цілий день на виконання сотень орієнтирів, виготовлення графіків тощо, чи можна щось зробити, щоб отримати розумний тест на відносну швидкість? Якісь ідеї чи думки? Я абсолютно помиляюся?
Програми, які я використовував наступним чином, ні в якому разі не тотожні:
#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;
}
Програма 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;
}
Спасибі заздалегідь!
Редагувати: Мені важлива платформа - це звичайний x86 або x86-64, який працює на комп’ютерах Linux та Windows.
Редагувати 2 (вставлено з коментаря нижче). Наразі у нас є широка база коду. Дійсно, я виступив проти узагальнення, що ми "не повинні використовувати float, оскільки обчислення цілих чисел швидше" - і я шукаю спосіб (якщо це навіть вірно) спростувати це узагальнене припущення. Я усвідомлюю, що неможливо було б передбачити точний результат для нас, якщо ми не виконали всю роботу та профілювали її згодом.
У будь-якому випадку, дякую за всі ваші чудові відповіді та допомогу. Сміливо додайте що-небудь ще :).
float
збільшується швидкість, але зазвичай double
це не так.
addl
замінюєтьсяfadd
, наприклад). Єдиний спосіб по-справжньому отримати хороший показник - отримати основну частину вашої реальної програми та профілі різних її версій. На жаль, це може бути досить важко, не використовуючи тонни зусиль. Можливо, розповісти нам про цільове обладнання та ваш компілятор допоможе людям принаймні надати вам попередній досвід тощо. Щодо вашого цілого використання, я підозрюю, що ви могли б створити такийfixed_point
клас шаблонів, який би надзвичайно полегшив таку роботу.