问题
我想要一个程序,它将编写一个序列,例如,
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 实现以 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
's转换为ByteString
's 的好方法(也许有使用 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
's 很快,正如这段代码所证明的,写了等量的字符,
import Data.ByteString.Char8 as B
main = B.putStrLn (B.replicate 76000000 '\n')
这将获得 1.3 GB/s,虽然没有 1.3 GB/s 快dd
,但显然要好得多。