ホーム ] TIPS ] ソフトウェア実験室 ]

上へ
ビットマップの処理速度
色変換速度
数式演算速度
冪乗演算速度
検索速度
文字列処理速度
文字列/数値処理速度
CPU演算速度
TicksとPerformance Counter
文字の数値化
数値化文字の再現
数値化文字の補間
補間の効果
ネイピア数
ネイピア数2
指数関数近似値
級数の収束速度1
級数の収束速度2
級数の精度
逆三角関数を求める
算術幾何平均でπを求める
全フォルダ列挙
ビットマップとメモリリソース
配列とメモリリソース

ソフトウェア実験室

CPU演算速度

最終更新:2006/03/23 記事変更

 CPUの演算速度、特に命令当りの単位演算速度は、理論としても、実測としても正確に分からない。特に、現在のCPUは内部で並列化やパイプライン化されており、理論的な速度も算出不能と言えるし、命令当りのクロック数もあまり意味がない。また、メモリ方式、メモリ速度でも変化する。

 そこで、ここでは、そのマシンにおける単位演算速度を、実測して見る。2006/3/23 測定方法を全自動にした。

●測定対象

 単位演算命令、比較(?)、加算(+)、減算(-)、乗算(*)、除算(/)、整数除算(\)、剰余(Mod)で、Byte、Short、Integer、Long、Decimal、Single、Double、 での演算速度をnsで測定する。

●方法

○演算時間

 それぞれ、最低2秒間以上ループし、その平均を単位演算速度とする。Forループ制御時間の影響を除外するために、下記のように、空のForループのみを計測して、差し引く方法はうまく行かない。

 For i = 0 To Cnt - 1
      'NOP
  Next

の時間 Tb を計測しておき、

 For i = 0 To Cnt - 1
      Operation
  Next

の時間 T を測定し、実演算時間を、 T - Tb とする。

などでは、空ループ時間を差し引くと負になる場合もある。これは、内部で演算命令と分岐制御の並列化が影響するものと思われる(数値演算が分岐制御に完全に隠れた場合など)。そこで、ループ処理 の影響を極力小さくする測定法とする。以下のように、同じ演算命令を20回連続させる方法とした。この場合は、空ループは測定しない。演算回数は、Cnt * 20 となる。Cnt 分だけ列挙するのが最も良いが、1億行は列挙できない。

  For i = 0 To Cnt - 1
      Operation
      Operation
        ・
        ・
        ・
        ・
      Operation

  Next

○\、Mod

 この測定では、分子が分母より大きくないと、実質の演算なしで終了となり、正しい時間が計測されない。乱数で値を生成する場合は、分子>分母 となるように調整する。

●結果 

 マシンは、P4 3.2GHz メモリはDDRのデュアル構成。

全自動で速度測定したもの

●考察

  • 除算/ は、整数型では目立って遅い。整数除算ではそこそことなっている。浮動小数点の場合は、その逆である。従って、整数型同士の除算で整数商が欲しければ、整数除算\ を使用すべきである。何の気なしに、/ をつい使ってしまうが、長大なループでは影響が大きい。.NETの解説では、演算子/ の場合、整数型は一旦より安全なDecimalに変換されるとあるが、結果を見ればうなずける。
  • Long * Long も遅い。これも、安全なDecimalに変換されている可能性がある。Long * Long でも、Long 以上にならない場合は、極力、Integer * Integer = Long とすべきである。 但し、結果がLongになる場合は、Integerのままではオーバフローとなってしまうので、CLng(Integer) とする。試験でもそうしている。
  • DoubleやSingleの演算速度は意外と速い。整数除算はさすが遅いが、あまり使用しないので問題はない。特に、乗除算が早いので、科学計算に良い。FFTの複素数演算でも期待できる。