
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
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