私は C++ でいくつかのパフォーマンスが重要な作業を行っています。現在、本質的に浮動小数点である問題に対して整数計算を使用しています。これにより、多くの厄介な問題が発生し、多くの厄介なコードが追加されます。
さて、浮動小数点の計算がおよそ 386 日ほど遅かったことについて読んだことを覚えています。私は (IIRC)、オプションのコプロセッサがあったと考えています。しかし、最近では指数関数的に複雑で強力な CPU が使用されているため、浮動小数点または整数の計算を行っても「速度」に違いはありませんか? 特に、実際の計算時間は、パイプラインのストールを引き起こしたり、メイン メモリから何かをフェッチしたりするようなものに比べて小さいので?
正しい答えはターゲット ハードウェアでベンチマークすることだと思いますが、これをテストするにはどのような方法がよいでしょうか? 私は 2 つの小さな C++ プログラムを作成し、それらの実行時間を Linux での「時間」と比較しましたが、実際の実行時間は変動しすぎています (仮想サーバーで実行している場合は役に立ちません)。何百ものベンチマークを実行したり、グラフを作成したりするのに 1 日を費やす以外に、相対速度を合理的にテストするためにできることはありますか? アイデアや考えはありますか?私は完全に間違っていますか?
私が次のように使用したプログラムは、決して同一ではありません。
#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;
}
前もって感謝します!
編集: 私が気にするプラットフォームは、デスクトップ Linux および Windows マシンで実行される通常の x86 または x86-64 です。
編集2(以下のコメントから貼り付け):現在、広範なコードベースがあります。実際、私は「整数計算の方が速いため、float を使用してはならない」という一般化に反対しました。この一般化された仮定を反証する方法を (これが真実である場合でも) 探しています。すべての作業を行って後でプロファイリングしない限り、正確な結果を予測することは不可能であることは理解しています。
とにかく、すべての優れた回答と助けに感謝します。他に何でも自由に追加してください:)。