.net - Haskell 或 F# 高吞吐量二进制 I/O

标签 .net haskell f# io

这两种语言的二进制 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 &lt 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 代码在相同数据类型上执行相同工作的性能大致相同。

要注意的关键软件包:

  • bytestring
  • binary
  • 关于.net - Haskell 或 F# 高吞吐量二进制 I/O,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4571464/

    相关文章:

    java - 在 Visual Studio 2008 中使用 Axis2 Web 服务

    c# - C# 中友元类用例的解决方法

    c# - 如何从 C# 管理 IIS?

    c - Haskell FFI 将多个数组传递给 C

    f# - WebSharper 官方网站上的简单示例存在问题

    c# - 如何使用 XmlSerializer 序列化对象类型的属性

    arrays - 在haskell中打印二维数组

    haskell - 在 n 维空间上进行快速最近邻搜索的纯函数数据结构是什么?

    F#在从记录列表派生的 map 上应用 Map.filter

    f# - 为什么 F# Set 需要 IComparable?