производительность — коды C ++ и 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");
}

составлено с 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

11

Решение

Если я компилирую следующие программы и запускаю ЖЕ БИНАРИИ — на некоторых платформах та, которая получена из кода на C ++, намного быстрее, чем на Haskell, на другой ситуация противоположная.

Кроме того, существует большая разница в производительности конечных двоичных файлов в зависимости от платформы, на которой они были построены. (Каждая платформа использует одни и те же флаги и одинаковые версии LVM и clang)

Вы видите влияние неприятных деталей работы реальных компьютеров:

  • оптимизация линкера
  • разные версии динамически загружаемых библиотек
  • качество генерации кода сборки для данной микроархитектуры
  • доступ к специализированным инструкциям
  • размеры кеша
  • планировщик операционной системы, распределитель, …
  • задержки памяти

Существует огромное количество кода и аппаратного обеспечения, которые отличаются между двумя платформами, что означает, что вы в конечном итоге измеряете разные вещи.

Нет оснований ожидать, что производительность будет одинаковой или даже в том же соотношении. Для микро-тестов не является необычным изменение относительного порядка при перемещении платформ.

16

Другие решения

Других решений пока нет …