Я выполняю некоторую критическую для производительности работу на 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, поскольку целочисленные вычисления выполняются быстрее» - и я ищу способ (если это даже правда) опровергнуть это обобщенное предположение. Я понимаю, что для нас было бы невозможно предсказать точный результат, если не сделаем всю работу и не профилируем ее потом.
В любом случае, спасибо за все ваши отличные ответы и помощь. Не стесняйтесь добавлять что-нибудь еще :).
addl
замененаfadd
на). Единственный способ получить действительно хорошие результаты - это получить основную часть вашей реальной программы и профилировать различные ее версии. К сожалению, это может быть довольно сложно без особых усилий. Возможно, сообщение нам о целевом оборудовании и вашем компиляторе поможет людям, по крайней мере, дать вам уже существующий опыт и т. Д. Что касается использования целых чисел, я подозреваю, что вы могли бы создать своего родаfixed_point
шаблонный класс, который значительно упростил бы такую работу.