Woj*_*ilo 11 c++ compiler-construction optimization performance haskell
我想问你是什么导致这种差异.如果我编译以下程序并运行相同的二进制文件 - 在某些平台上,由C++代码生成的程序比Haskell程序快得多,在其他情况下则相反.
另外,根据它们构建的平台,最终二进制文件的性能有很大差异.(每个平台使用相同的标志和相同版本的LVM和clang)
代码已经过优化,应该可以使用相同的性能 - 请参阅:Haskell能否以与Clang/GCC相同的方式优化函数调用?.
我想问你,怎么可能.
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");
}
Run Code Online (Sandbox Code Playgroud)
用.编译 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."
Run Code Online (Sandbox Code Playgroud)
用.编译 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
Run Code Online (Sandbox Code Playgroud)
Don*_*art 16
如果我编译以下程序并运行相同的二进制文件 - 在某些平台上,由C++代码生成的程序比Haskell程序快得多,在其他情况下则相反.
另外,根据它们构建的平台,最终二进制文件的性能有很大差异.(每个平台使用相同的标志和相同版本的LVM和clang)
您正在看到真实计算机令人讨厌的操作细节的影响:
两个平台之间存在大量不同的代码和硬件,这意味着您最终会测量不同的东西.
没有理由期望性能相同,甚至是相同的比率.对于微基准测试,在移动平台时翻转相对排序并不罕见.
| 归档时间: |
|
| 查看次数: |
1017 次 |
| 最近记录: |