gpt4 book ai didi

C++ 和 Haskell 代码在不同机器上的执行时间不同

转载 作者:可可西里 更新时间:2023-11-01 15:06:51 25 4
gpt4 key购买 nike

我想问你是什么导致了这种差异。如果我编译以下程序并运行相同的二进制文件——在某些平台上,由 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

最佳答案

If I compile the following programs and run THE SAME BINARIES - on some platforms the one resulted from C++ code is much faster than the Haskell one, on other the situation is opposite.

Additional there is a big difference in the performance of final binaries according to which platform they were built on. (Each platform uses the same flags and the same versions of LVM and clang)

您正在看到真实计算机的烦人操作细节的影响:

  • 链接器优化
  • 不同版本的动态加载库
  • 给定微架构的汇编代码生成质量
  • 获得专业说明
  • 缓存大小
  • 操作系统调度器、分配器、...
  • 内存延迟

两个平台之间存在大量不同的代码和硬件,这意味着您最终会测量不同的东西。

没有理由期望性能相同,甚至比率相同。对于微基准测试,在移动平台时翻转相对顺序并不罕见。

关于C++ 和 Haskell 代码在不同机器上的执行时间不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17412348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com