この単純な「ベンチマーク」を検討してください。
n :: Int
n = 1000
main = do
print $ length [(a,b,c) | a<-[1..n],b<-[1..n],c<-[1..n],a^2+b^2==c^2]
および適切なC
バージョン:
#include <stdio.h>
int main(void)
{
int a,b,c, N=1000;
int cnt = 0;
for (a=1;a<=N;a++)
for (b=1;b<=N;b++)
for (c=1;c<=N;c++)
if (a*a+b*b==c*c) cnt++;
printf("%d\n", cnt);
}
コンパイル:
- Haskell バージョンは次のようにコンパイルされます:
ghc -O2 triangle.hs
(ghc 7.4.1) - C バージョンは次のようにコンパイルされます:
gcc -O2 -o triangle-c triangle.c
(gcc 4.6.3)
実行時間:
- Haskell: 実数 4.308 秒
- C: 1.145 秒リアル
Haskell がほぼ 4 倍遅いほど単純で最適化が容易なプログラムであっても、動作は問題ないのでしょうか? Haskell はどこで時間を無駄にしますか?