【发布时间】:2013-06-29 00:56:23
【问题描述】:
我想问你是什么导致了这种差异。如果我编译以下程序并运行相同的二进制文件 - 在某些平台上,由 C++ 代码生成的程序比 Haskell 代码快得多,而在其他平台上则相反。
另外,最终二进制文件的性能会根据它们构建的平台而存在很大差异。 (每个平台使用相同的标志和相同版本的 LVM 和 clang)
这些代码已经过优化,应该具有类似的性能 - 请参阅:Can Haskell optimize function calls the same way Clang / GCC does?。
我想问你,怎么可能。
C++ 代码:
#include <cstdio>
#include <cstdlib>
int b(const int x){
return x+5;
}
int c(const int x){
return b(x)+1;
}
int d(const int x){
return b(x)-1;
}
int a(const int x){
return c(x) + d(x);
}
int main(int argc, char* argv[]){
printf("Starting...\n");
long int iternum = atol(argv[1]);
long long int out = 0;
for(long int i=1; i<=iternum;i++){
out += a(iternum-i);
}
printf("%lld\n",out);
printf("Done.\n");
}
用clang++ -O3 main.cpp编译
haskell 代码:
module Main where
import qualified Data.Vector as V
import System.Environment
b :: Int -> Int
b x = x + 5
c x = b x + 1
d x = b x - 1
a x = c x + d x
main = do
putStrLn "Starting..."
args <- getArgs
let iternum = read (head args) :: Int in do
putStrLn $ show $ V.foldl' (+) 0 $ V.map (\i -> a (iternum-i))
$ V.enumFromTo 1 iternum
putStrLn "Done."
用ghc -O3 --make -fforce-recomp -fllvm ghc-test.hs编译
结果(在不同平台上测试相同的二进制文件)
// binaries compiled on Ubuntu:
Ubuntu x64 @ Intel i7-3610QM CPU @ 2.30GHz : C++:0.775s, GHC:1.01s
Gentoo x64 @ Intel i7-Q720 CPU @ 1.6GHz : C++:3.6s, GHC:2.1s
// binaries compiled on Gentoo:
Ubuntu x64 @ Intel i7-3610QM CPU @ 2.30GHz : C++:0.782s, GHC:1.01s
Gentoo x64 @ Intel i7-Q720 CPU @ 1.6GHz : C++:2.3s, GHC:1.3s
【问题讨论】:
-
编译器的输出可以针对不同的芯片组进行优化。我将重复我对您上一个问题所说的话:检查程序集输出。
-
@chrisaycock 我上次没有看到你的评论 - 我会做的
-
@H2CO3:“C++ 是一种编译语言,Haskell 是一种解释语言。”这是错误的。 GHC 是一个编译器。它生成本机代码。语言本身既不是解释器也不是编译器,但可以为任何实用语言(包括 C++)编写解释器或编译器。
-
这些是不同的系统,具有不同的内核、不同的特性,可能是您链接到的具有不同性能配置文件的不同库。没有理由想象它们会有相同的性能配置文件!
-
“静态”编译它们以消除由动态库引起的任何差异。
标签: c++ performance haskell optimization compiler-construction