TadaoYamaokaの開発日記

個人開発しているスマホアプリや将棋AIの開発ネタを中心に書いていきます。

コンパイラによるFFTの速度比較

※記事の内容は古い内容となっています。こちらに再測定した結果があります。


コンパイラによってどれだけFFTの実行速度に違いがあるのか比較してみた。

Visual C++ 2013で、x86とx64それぞれの版とx86はオプションにSSE2を有効にした版、x64でPGOビルドを有効にした版、それから、GccLLVM/clang、参考としてJavaでも測定した。

FFTのライブラリは、大浦版FFT(FFT Package 1-dim / 2-dim)のfftsg.cのrdftを使用した。

Javaのライブラリは、大浦版FFTJavaに移植したもの(大浦版FFTのJava移植)を使用した。

Visual C++の最適化は実行速度の最大化(/O2)を使用し、
GccLLVM/clangはcygwinの1.7.33を使用し、最適オプションはO3とした。

測定環境は、Core i7-3770 3.40GHz、Windows 7 64bit。

rdftを1万回実行する時間を計測し、それを5回行い平均をとった。

測定結果は以下のとおり。

コンパイラ 5回実行の平均
Visal C++ x86 552.2ms
Visal C++ x86 SSE2 555ms
Visal C++ x64 492.6ms
Visal C++ x64 PGOビルド 602ms
Gcc -O3 1691.2ms
LLVM/clang -O3 842.2ms
Java 8 824.6ms


Visal C++で、x64でビルドしたものが最も速いという結果になった。

PGOビルドで遅くなったのは予想外の結果である。手順がおかしいのか原因は不明。

Gccが最適オプションをO3にしても最も遅かった。
LLVMは期待していたがVisual C++には及ばないようである。

そして、最も意外だったのは、Java 8が結構速いという結果である。
GccLLVM/clangより速かったので、Javaだから遅いだろうという予想に反した結果となった。
JITでネイティブにコンパイルされた後は速いようである。

VocalPitchMonitor

VocalPitchMonitor

  • Tadao Yamaoka
  • ミュージック
  • ¥250
Audio Spectrum Monitor

Audio Spectrum Monitor

  • Tadao Yamaoka
  • ミュージック
  • ¥120