C++和Haskell代码在不同机器上的执行时间不同
C++ and Haskell codes differs in execution time on different machines
我想问您是什么导致了这种差异。如果我编译以下程序并运行相同的二进制程序——在某些平台上,C++代码产生的二进制程序比Haskell的要快得多,而在另一些平台上,情况正好相反。
此外,最终二进制文件的性能也有很大差异,这取决于它们是在哪个平台上构建的。(每个平台都使用相同的标志和相同版本的LVM和clang)
代码经过了优化,应该可以使用simmilar性能-请参阅: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("%lldn",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
如果我编译以下程序并运行相同的二进制程序——在某些平台上,C++代码产生的二进制程序比Haskell的要快得多,而在另一些平台上,情况正好相反。
此外,最终二进制文件的性能也有很大差异,这取决于它们是在哪个平台上构建的。(每个平台都使用相同的标志和相同版本的LVM和clang)
你正在看到真实计算机令人讨厌的操作细节的影响:
- 链接器优化
- 不同版本的动态加载库
- 给定微体系结构的汇编代码生成质量
- 访问专用指令
- 缓存大小
- 操作系统调度程序、分配器
- 内存延迟
这两个平台之间有大量的代码和硬件不同,这意味着你最终会衡量不同的东西。
没有理由期望性能是相同的,甚至是相同的比例。对于微型基准测试,在移动平台时翻转相对顺序并不罕见。
相关文章:
- 简单C++"Hello World"程序的执行时间长
- 我使用 OpenMP 的线程越多,执行时间就越长,这是怎么回事?
- 为什么切换 for 循环的顺序会显著改变执行时间?
- cmd.exe与Powershell中C++程序的不同执行时间
- pthread执行时间比顺序执行时间差
- OpenCV 函数 cv::remap() 的执行时间更长,当程序在两者之间进入睡眠状态时
- 为什么 std::chrono 在测量循环和编译器优化的并行 OpenMP 的执行时间时不起作用?
- 我需要帮助来缩短检索 SSL 证书的执行时间
- 如何测量cudaMalloc执行时间
- c++中的执行时间和检查流状态
- 为什么for循环中的异步不能提高执行时间
- 为什么 C++ openMP 程序执行时间更长
- 测量任何 Windows 可执行文件的内存使用情况和执行时间
- 需要减少我的C++代码的执行时间
- 如何在 ubuntu 上的 php 脚本中获取程序(c,c++,java,python,php)的执行时间和内存使用量?
- 在Qt中设置pixmap时的执行时间很奇怪
- 异步控制线程执行时间
- 如何对 g++ 设置执行时间限制?
- 测量 std::系统的实际执行时间(以 C++ 为单位)
- C++和Haskell代码在不同机器上的执行时间不同