Estou fazendo um trabalho crítico de desempenho em C ++ e atualmente estamos usando cálculos inteiros para problemas que são inerentemente de ponto flutuante porque "é mais rápido". Isso causa muitos problemas irritantes e adiciona muitos códigos irritantes.
Agora, eu me lembro de ter lido sobre como os cálculos de ponto flutuante eram tão lentos aproximadamente por volta dos 386 dias, onde eu acredito (IIRC) que havia um coprocessador opcional. Mas certamente hoje em dia com CPUs exponencialmente mais complexas e poderosas não faz diferença na "velocidade" se estiver fazendo cálculo de ponto flutuante ou inteiro? Especialmente porque o tempo de cálculo real é minúsculo em comparação a algo como causar uma paralisação no pipeline ou buscar algo na memória principal?
Eu sei que a resposta correta é fazer o benchmark no hardware de destino, qual seria uma boa maneira de testar isso? Eu escrevi dois pequenos programas C ++ e comparei seu tempo de execução com "tempo" no Linux, mas o tempo de execução real é muito variável (não ajuda, estou executando em um servidor virtual). Sem passar o dia inteiro executando centenas de benchmarks, fazendo gráficos, etc., há algo que eu possa fazer para obter um teste razoável da velocidade relativa? Alguma ideia ou pensamento? Estou completamente errado?
Os programas que usei como segue, eles não são idênticos de forma alguma:
#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;
}
Programa 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;
}
Desde já, obrigado!
Edit: A plataforma que me interessa é regular x86 ou x86-64 rodando em máquinas desktop Linux e Windows.
Editar 2 (colado de um comentário abaixo): Temos uma ampla base de código atualmente. Na verdade, eu me deparei com a generalização de que "não devemos usar float, pois o cálculo de inteiro é mais rápido" - e estou procurando uma maneira (se isso for verdade) de refutar essa suposição generalizada. Sei que seria impossível prever o resultado exato para nós sem fazer todo o trabalho e traçá-lo depois.
De qualquer forma, obrigado por todas as suas excelentes respostas e ajuda. Sinta-se à vontade para adicionar qualquer outra coisa :).
float
obtém o aumento de velocidade, mas geralmente double
não.
addl
substituído porfadd
, por exemplo). A única maneira de realmente obter uma boa medição é obter uma parte central do seu programa real e criar perfis de versões diferentes dele. Infelizmente, isso pode ser muito difícil sem usar muito esforço. Talvez nos dizer o hardware de destino e seu compilador ajudaria as pessoas a pelo menos dar a você experiência pré-existente, etc. Sobre seu uso de inteiros, eu suspeito que você poderia fazer uma espécie defixed_point
classe de modelo que facilitaria esse trabalho tremendamente.