Haskell или F # с высокой пропускной способностью двоичного ввода-вывода

Насколько хороша производительность библиотек двоичного ввода-вывода на этих двух языках> Я подумываю о переписывании уродливого (но очень быстрого) кода C ++, который обрабатывает двоичные файлы размером около 5- 10 ГБ с использованием стандартных функций fread и fwrite. Какой фактор замедления следует ожидать от оптимизированной реализации в 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
11
задан Jonathan Leffler 16 January 2011 в 01:57
поделиться