简而言之:我需要检查简单操作的Haskell速度,目前效果不佳,但是我不确定是否正确地进行了编译/优化。
UPD:问题已已回答,请参见注释-问题出在不同的整数类型...
详细信息:
我在一个项目中工作,该项目中有许多服务正在对数据进行批量处理,因此这些服务的至少某些部分仅需要快速。他们正在对数据进行大量的计算和操作,而不仅仅是提取负载。换句话说,这取决于每个1e15
数据记录上要花多少个实例和几个小时。
当前,我们正在考虑为项目添加更多服务,并且一些同事很好奇地尝试使用与已经使用的语言不同的语言来编写它们。我对此大致满意,但我坚持认为我们首先要检查所提议语言的“核心性能”。当然,速度测试是困难且有争议的,所以我建议我们使用非常简单的测试,具有简单的操作且没有复杂的数据结构等。我们同意“差的递归”斐波那契函数:
fib x
| x < 2 = x
| otherwise = fib (x - 2) + fib (x - 1)
main = print (fib 43)
为了比较,我用几种语言写了它。 C版本看起来像:
#include <stdio.h>
int fib(int x) {
return (x < 2) ? x : (fib(x - 2) + fib (x - 1));
}
int main(void) {
printf("%d\n", fib(43));
}
我用ghc -O2 test.hs
编译前一个,而用gcc -O2 test.c
编译后一个。 GHC版本是8.4.3。现在,我看到结果相差大约12倍(在同一台计算机上,C版为2.2秒,Java版为3秒,Haskell为30秒)。
我想知道我是否正确地执行了有关编译器和编译器选项的所有操作。因为我认为Haskell可以编译为本机代码(?),所以它应该可以与C语言和类似语言进行比较。我需要有关此的提示。
P.S。请不要说斐波那契函数可以在没有“指数”递归的情况下编写-我知道-但是正如我所说的,我们需要通过大量简单的计算进行测试。
P.P.S。我不是说,如果我们不能使Haskell更快,我们就不会使用它。但可能我们会将其保留给其他服务,这些服务主要花费在输入输出上,因此这无关紧要。对于当前的一系列“速度关键”服务,客户每月要为这些实例支付10000美元还是120000美元就可以了。