[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