Haskell performance

MR K P SCHUPKE k.schupke at imperial.ac.uk
Thu Mar 18 10:56:11 EST 2004


How can you take the results of a comparison like that seriously:

For example the "reverse file" test, here is the Haskell actually used:

main = interact $ unlines . reverse . lines


and here is the C:


/* -*- mode: c -*-
 * $Id: reversefile.gcc,v 1.10 2001/07/20 17:20:32 doug Exp $
 * http://www.bagley.org/~doug/shootout/
 * from Brad Knotwell
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define MAXREAD 4096

int main(int argc, char *argv[]) {
    int nread, len = 0, size = (4 * MAXREAD);
    char *cp, *buf = malloc(size + 1);

    while((nread = read(0,(buf+len),MAXREAD)) > 0) {
        len += nread;
        if(MAXREAD > (size - len)) {
            size <<= 1;
            if((buf = realloc(buf,size+1)) == NULL)
                return(fprintf(stderr,"realloc failed\n"),EXIT_FAILURE);
        }
    }

    if(nread == -1) return(fprintf(stderr,"read\n"),EXIT_FAILURE);

    for (cp = buf+len-1; cp != buf; --cp,nread++)
        if ('\n' == *cp) {
            fwrite(cp+1,nread,1,stdout);
            nread = 0;
        }

    fwrite(cp,nread+1,1,stdout);
    free(buf);
    return(EXIT_SUCCESS);
}


Firstly, which of these is more likely to contain an error. A wrong program
scores infinity on the time scale, so Haskell is infinitely faster than a wrong
C program.

Secondly, The C program is using buffers, the Haskell program could use raw IO
and buffers too. If it did it would ba a lot faster, and use about the same
memory as the C code...

In my experiance poor Haskell performance is usually due to not understanding
how the language works (for example head/tail are fast, init/last are slow), or
not using the equivalent techniques in Haskell. To do the equivalent of the C
you could use: http://www.haskell.org/~simonmar/io/System.IO.html

        Regards,
        Keean.


More information about the Glasgow-haskell-users mailing list