[Haskell-cafe] Shootout favoring imperative code

Chris Kuklewicz haskell at list.mightyreason.com
Thu Jan 5 15:35:56 EST 2006


I did manage to tweak SumFile to use unboxed Int# and go 10% faster.

http://haskell.org/hawiki/SumFile


Sebastian Sylvan wrote:
> On 1/5/06, Chris Kuklewicz <haskell at list.mightyreason.com> wrote:
> 
>>Also about sum-file: They do not reveal what the actual 8k test file
>>contains.  So there is no way to reproduce the benchmark locally for
>>testing.  (One can learn it totals 400000, but since negative numbers
>>are allowed, this does not help much).
>>
>>The problem can even be solved in one line with (g)awk.
>>
>>Apparantly it is bottlenecked by parsing strings into integers, but they
>>specify "Programs should use built-in line-oriented I/O functions rather
>>than custom-code." which means the programmer's hands are completely
>>tied.  So it is just a benchmark of the build-in library function, not
>>of any algorithm the programmer provides.
>>
>>There is no need to beat a dead horse, though.  This benchmark sets out
>>to test fgets / atoi, and that is all.  There are better benchmarks to
>>spend time on.
>>
> 
> 
> I agree. The benchmark really is about how fast you can call low-level
> IO system calls. But since Haskell is a high-level language it's
> natural that it's a bit difficult to get access to these unsafe (but
> fast) low-level functions.
> In fact, if I really wanted to do this, I would use the FFI...
> 
> Do you think they'll accept this contribution for sum-file?
> 
> --------
> 
> import Foreign.C
> import Foreign.Ptr
> import Foreign.Marshal.Array
> 
> foreign import ccall "stdio.h" fgets :: CString -> Int -> Ptr CFile ->IO CString
> foreign import ccall safe "stdlib.h" atoi :: CString -> Int
> foreign import ccall safe "stdio.h &(*stdin)" c_stdin :: Ptr CFile
> 
> bufferSize = 128
> 
> loop :: CString -> Int -> IO Int
> loop buf v =
>     do ret <- fgets buf bufferSize c_stdin
>        case (ret == nullPtr) of
>          True  -> return v -- eof, or some other error
>           False -> do let i = atoi buf
> 		     i `seq` loop buf (v + i) -- force eval of 'i'!
> 
> main = do v <- allocaArray bufferSize (\buf -> loop buf 0)
>           print v
> 
> --------------
> 
> --
> Sebastian Sylvan
> +46(0)736-818655
> UIN: 44640862
> 



More information about the Haskell-Cafe mailing list