
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.