11

この違いの原因は何なのかお聞きしたいです。次のプログラムをコンパイルして同じバイナリを実行すると、一部のプラットフォームでは 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

ハスケルコード:

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
4

1 に答える 1

16

次のプログラムをコンパイルして同じバイナリを実行すると、一部のプラットフォームでは C++ コードから生成されたものの方が Haskell のものよりもはるかに高速であり、他のプラットフォームでは状況が逆になります。

さらに、ビルドされたプラットフォームに応じて、最終的なバイナリのパフォーマンスに大きな違いがあります。(各プラットフォームは同じフラグと同じバージョンの LVM と clang を使用します)

実際のコンピューターの厄介な操作の詳細の影響を確認しています。

  • リンカーの最適化
  • 動的にロードされるライブラリの異なるバージョン
  • 特定のマイクロ アーキテクチャのアセンブリ コード生成の品質
  • 特別な指示へのアクセス
  • キャッシュサイズ
  • オペレーティング システムのスケジューラ、アロケータ、...
  • メモリレイテンシ

2 つのプラットフォーム間では膨大な量のコードとハードウェアが異なるため、異なるものを測定することになります。

パフォーマンスが同じ、または同じ比率であることを期待する理由はありません。マイクロベンチマークの場合、プラットフォームを移動するときに相対的な順序を反転することは珍しくありません。

于 2013-07-02T09:27:34.153 に答える