I'm pleased to announce version 0.2 of FPS, the fast, packed string library for Haskell.
FPS allows you to have time and space efficient arrays of bytes accessed via a List interface, along with fast IO on those strings. FPS is, in particular, suited for heavy duty string and IO projects. It is also useful for applications that must pass strings back and forward from C. Version 0.2 features a number of improvements over v0.1. * Its faster! * There is a richer interface. * More support for converting between C, Addr# and Haskell strings. (in particular, there are 0-copy functions to create FPS strings from Addr# and to create CStrings from FPS') Get it here: Homepage: http://www.cse.unsw.edu.au/~dons/fps.html Interface: http://www.cse.unsw.edu.au/~dons/fps/Data.FastPackedString.html FTP: ftp://ftp.cse.unsw.edu.au/pub/users/dons/fps/fps-0.2.tar.gz darcs: darcs get --partial http://www.cse.unsw.edu.au/~dons/code/fps Cheers, Don ------------------------------------------------------------------------ Here are benchmarking results for 20M strings, for versions 0.1 and 0.2 of FPS, compared against Simon Marlow's prototype packedstring code, the current Data.PackedString library and traditional [Char] functions. Functions that are only provided by FPS (such as the various CString routines) are not tested. Key: FPS2 = Fast Packed String v2 FPS1 = Fast Packed String v1 SPS = Simon Marlow's packedstring prototype PS = Data.PackedString [a] = [Char] ~ = unchanged from FPS2 - = no function exists ! = stack or memory exhaustion Size of test data: 21256k Time in seconds. FPS2 FPS1 SPS PS* [a] ++ 0.078 ~ ! ! 1.288 length 0.000 ~ 0.000 0.000 0.131 pack 0.345 2.043 0.502 0.337 - unpack 1.596 ~ 1.630 7.445 - compare 0.000 ~ 0.000 0.000 0.000 index 0.000 ~ 0.000 0.000 0.000 map 2.664 4.283 2.917 4.813 7.286 filter 0.282 0.482 2.805 0.954 0.305 take 0.000 ~ 0.000 0.024 0.005 drop 0.000 ~ 0.000 11.768 0.130 takeWhile 0.000 ~ 1.498 0.000 0.000 dropWhile 0.000 ~ 1.985 8.447 0.130 span 0.000 ~ 9.289 11.144 0.131 break 0.000 ~ 9.383 11.268 0.133 lines 0.421 ~ 1.114 1.367 2.790 unlines 0.121 ~ ! ! 10.950 words 2.115 3.202 2.128 5.644 4.184 unwords 0.058 ~ ! ! 1.305 reverse 0.024 4.606 12.997 13.018 1.622 concat 0.029 ~ 12.701 11.459 1.163 cons 0.016 3.094 2.064 8.358 0.131 snoc 0.017 1.536 - - - empty 0.000 ~ 0.000 0.000 0.000 head 0.000 ~ 0.000 0.000 0.000 tail 0.000 ~ 0.000 14.490 0.130 last 0.000 ~ - - 0.143 init 0.000 ~ - - 1.147 inits 5.350 - - - ! tails 6.634 - - - 1.136 intersperse 0.034 4.590 - - 10.517 concatMap ! - - - 1.131 any 0.000 ~ - - 0.000 all 0.000 ~ - - 0.000 sort 14.380 15.773 - - ! maximum 0.024 ~ - - 0.183 minimum 0.025 ~ - - 0.185 replicate 0.008 ~ - - 0.053 elem 0.000 ~ 1.490 0.001 0.000 find 0.278 0.366 - - 0.000 elemIndex 0.000 ~ - - 0.000 elemIndicies 4.192 ~ - - 0.314 * Note that it is not possible to directly read a string larger than 1M into a Data.PackedString (due to a space leak). Instead you need to use packString _______________________________________________ Haskell mailing list Haskell@haskell.org http://www.haskell.org/mailman/listinfo/haskell