考虑这个简单的“基准”:
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.308s 真实
- C: 1.145s 实数
即使对于 Haskell 几乎慢 4 倍这样简单且可优化的程序,它的行为是否正常?Haskell 在哪里浪费时间?