質問
次のようなシーケンスを記述するプログラムが必要です。
1
...
10000000
ファイルに。まともなパフォーマンスが得られる最も簡単なコードは何ですか? 私の直感は、バッファリング不足の問題があるということです。私の C コードは 100 MB/s で実行されますが、参考までに、Linux コマンド ライン ユーティリティdd
は9 GB/s 3 GB/s で実行されます (不正確で申し訳ありません。コメントを参照してください。全体像にもっと興味があります。 -大きさですが)。
これは今では解決された問題だと思うかもしれません...つまり、最新のコンパイラーは、適度にうまく機能するようなプログラムをすぐに書くことができます...
Cコード
#include <stdio.h>
int main(int argc, char **argv) {
int len = 10000000;
for (int a = 1; a <= len; a++) {
printf ("%d\n", a);
}
return 0;
}
でコンパイルしていclang -O3
ます。8 回コールするパフォーマンス スケルトンputchar('\n')
は、同等のパフォーマンスを取得します。
Haskell コード
単純な Haskell 実装は 13 MiB/秒で実行され、ghc -O2 -optc-O3 -optc-ffast-math -fllvm -fforce-recomp -funbox-strict-fields
. (ライブラリを-fllvm
で再コンパイルしていません。おそらく再コンパイルする必要があります。) コード:
import Control.Monad
main = forM [1..10000000 :: Int] $ \j -> putStrLn (show j)
私の Haskell での最高のスタブは、さらに遅く、17 MiB/秒です。Vector
問題は、 を に変換する良い方法が見つからないことですByteString
(おそらく iteratees を使用した解決策がありますか?)。
import qualified Data.Vector.Unboxed as V
import Data.Vector.Unboxed (Vector, Unbox, (!))
writeVector :: (Unbox a, Show a) => Vector a -> IO ()
writeVector v = V.mapM_ (System.IO.putStrLn . show) v
main = writeVector (V.generate 10000000 id)
このコードで示されているように、 の書き込みByteString
は高速のようで、同等の文字数を書き込み、
import Data.ByteString.Char8 as B
main = B.putStrLn (B.replicate 76000000 '\n')
これは 1.3 GB/s で、 ほど高速ではありませんdd
が、明らかにはるかに優れています。