为什么我的Haskell代码与Swift和C相比是如此之慢

Aro*_*Lee 3 haskell

这是非常简单的Haskell代码,用于查找满足毕达哥拉斯定理的1到200的所有毕达哥拉斯整数X ^ 2 = Y ^ 2 + Z ^ 2

哈斯克尔:

let l = [1..200]
let pythagoras = [ x | x <- l, y <- l, z <- l, x^2 == y^2 + z^2]
Run Code Online (Sandbox Code Playgroud)

完成它需要24.1秒,

Swift:使用标准循环 0.05秒

C:使用标准循环 0.022秒

在此输入图像描述

Tho*_*son 9

我测量运行的Haskell代码0.03 seconds,让我相信你已经在解释器(用于开发,而不是高性能执行)中运行它,而不是编译代码.此外,您可能将类型默认为Integer而不是使用机器Int值.

tommd@HalfAndHalf /tmp% ghc -O2 t.hs && time ./t >/dev/null
[1 of 1] Compiling Main             ( t.hs, t.o )
Linking t ...
./t > /dev/null  0.03s user 0.00s system 87% cpu 0.040 total
tommd@HalfAndHalf /tmp% cat t.hs

main :: IO ()
main = do
  let l = [1..200] :: [Int]
  let pythagoras = [ x | x <- l, y <- l, z <- l, x^2 == y^2 + z^2]
  print pythagoras
Run Code Online (Sandbox Code Playgroud)