À quel point la performance des bibliothèques d'E/S binaires est-elle bonne dans ces deux langages? Je pense à réécrire un code C++ laid (mais très rapide) qui traite des fichiers binaires d'environ 5-10 Go en utilisant les fonctions standard fread et fwrite. Quel facteur de ralentissement devrais-je m'attendre à voir pour une implémentation optimisée en F# et Haskell?
ÉDITER: voici l'implémentation en C du comptage des zéros (tampon alloué sur le tas).
#include
#include
#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("Échec de l'ouverture de %s\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;
}
Les résultats:
$ gcc -O3 -o ioc io.c
$ ghc --make -O3 -o iohs io.hs
Lien de iohs ...
$ time ./ioc 2.bin
462741044
réel 0m16.171s
utilisateur 0m11.755s
système 0m4.413s
$ time ./iohs 2.bin
4757708340
réel 0m16.879s
utilisateur 0m14.093s
système 0m2.783s
$ ls -lh 2.bin
-rw-r--r-- 1 14G Jan 4 10:05 2.bin