[Haskell-cafe] #haskell works

Andrew Coppin andrewcoppin at btinternet.com
Sat Dec 15 17:39:02 EST 2007


Don Stewart wrote:
> andrewcoppin:
>   
>> (Apparently the library isn't 100% complete as yet.)
>>     
>
> Right, we haven't bothered with streaming versions of 'words'. 
> However, the maximumBy and map happily fuse into a single loop.
>   

Indeed. And hopefully when words gets implemented, we will have One Loop 
to rule them all... er... well you know what I mean.

>> Hmm, perhaps to really show this off, we need a more complicated 
>> program. Something that would be just too hard to implement as 1 loop in 
>> C, but is easy for the GHC optimiser to build. I shall meditate on this 
>> further...
>>     
>
> Do you have the single loop C program, btw? I'd be curious to see if
> this is really "feasible". It would have to do the buffering, tokenising
> and accumulating in one go. I'd imagine it is a bit hairy.
>
> And, it should not significantly outperform, say, a bytestring version.
> If it does, I'd like to see that.
>   

First version:

n = 0;
while( n < FILE_SIZE )
{
 while( n < FILE_SIZE  && file[n++] == ' ' ); wStart = n;
 while( n < FILE_SIZE  && file[n++] != ' ' ); wLength = n - wStart;
 if( wLength > strlen( longestString ) )  strncpy( longestString , file 
+ wStart , wLength );
}

Takes 0.016 seconds to process a 2.4 MB file. [But not the same one Don 
used.]

Then Mr C++ looked at it and said "OMG! You don't *never* use strlen() 
inside a loop!" and the second version was writting:

file[FILE_SIZE] = ' ';
n = 0;
maxLength = 0;
while( n < FILE_SIZE )
{
 while( file[n++] == ' ' ); wStart = n;
 while( file[n++] != ' ' ); wLength = n - wStart;
 if( wLength > maxLength )
 {
   longestWordStart = wStart;
   maxLength = wLength;
 }
}
strncpy( longestString , file + longestWordStart , maxLength );

This version takes 0.005 seconds.

I have no idea what kind of hardware this is running on - or even which 
compiler or OS.



More information about the Haskell-Cafe mailing list