这两种语言的二进制 I/O 库的性能有多好> 我正在考虑使用标准的 fread 和 fwrite 函数重新编写一个丑陋的(但非常快的)C++ 代码来处理大约 5-10GB 的二进制文件。对于 F# 和 Haskell 中的优化实现,我应该期待什么减速因素?
编辑:
这是计算零字节(在堆上分配的缓冲区)的 C 实现。
#include <stdio.h>
#include <stdlib.h>
#define SIZE 32*1024
int main(int argc, char* argv[])
{
FILE *fp;
char *buf;
long i = 0, s = 0, l = 0;
fp = fopen(argv[1], "rb");
if (!fp) {
printf("Openning %s failed\n", argv[1]);
return -1;
}
buf = (char *) malloc(SIZE);
while (!feof(fp)) {
l = fread(buf, 1, SIZE, fp);
for (i = 0; i < l; ++i) {
if (buf[i] == 0) {
++s;
}
}
}
printf("%d\n", s);
fclose(fp);
free(buf);
return 0;
}
结果:
$ gcc -O3 -o ioc io.c
$ ghc --make -O3 -o iohs io.hs
Linking iohs ...
$ time ./ioc 2.bin
462741044
real 0m16.171s
user 0m11.755s
sys 0m4.413s
$ time ./iohs 2.bin
4757708340
real 0m16.879s
user 0m14.093s
sys 0m2.783s
$ ls -lh 2.bin
-rw-r--r-- 1 14G Jan 4 10:05 2.bin
最佳答案
Haskell 使用基于 ByteString 的惰性 IO,并带有“二进制”解析器,其性能应该与 C 代码在相同数据类型上执行相同工作的性能大致相同。
要注意的关键软件包:
关于.net - Haskell 或 F# 高吞吐量二进制 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4571464/