Performance/Strings
From HaskellWiki
(Clean up) |
(Change Data.FastPackedString do Data.ByteString) |
||
| (4 intermediate revisions not shown.) | |||
| Line 1: | Line 1: | ||
{{Performance infobox}} | {{Performance infobox}} | ||
| + | [[Category:Performance|Strings]] | ||
==Strings== | ==Strings== | ||
| Line 6: | Line 7: | ||
number of options: | number of options: | ||
| - | + | * One of the packed string libraries, for example [http://www.cse.unsw.edu.au/~dons/fps.html Data.ByteString] | |
| - | * One of the | + | |
* Unboxed arrays of Word8 or Char | * Unboxed arrays of Word8 or Char | ||
* Ptrs to foreign malloced Word8 buffers | * Ptrs to foreign malloced Word8 buffers | ||
| Line 14: | Line 14: | ||
Char types, in that they provide the usual list-like operations. | Char types, in that they provide the usual list-like operations. | ||
| - | Some interesting results for | + | Some interesting results for Data.ByteString are documented |
[http://www.cse.unsw.edu.au/~dons/code/fps/README here]. In particular, | [http://www.cse.unsw.edu.au/~dons/code/fps/README here]. In particular, | ||
it compares FPS against the existing PackedString and [Char] functions, | it compares FPS against the existing PackedString and [Char] functions, | ||
| - | and is used successfully with 1 | + | and is used successfully with 1 terabyte strings. |
==Example== | ==Example== | ||
| Line 39: | Line 39: | ||
completes in a fairly quick 0.2s. Still, we can do better. | completes in a fairly quick 0.2s. Still, we can do better. | ||
| - | === Attempt 2 : | + | === Attempt 2 : Data.ByteString === |
| - | Using [http://www.cse.unsw.edu.au/~dons/fps.html | + | Using [http://www.cse.unsw.edu.au/~dons/fps.html ByteString], we get: |
<haskell> | <haskell> | ||
| - | import qualified Data. | + | import qualified Data.ByteString as B |
import IO | import IO | ||
| - | main = | + | main = B.readFile "/usr/share/dict/words" >>= B.putStr . last . B.lines |
</haskell> | </haskell> | ||
| Line 69: | Line 69: | ||
An extended tutorial on using PackedStrings/ByteStrings for high performance string manipulating code is [[Wc|here]]. | An extended tutorial on using PackedStrings/ByteStrings for high performance string manipulating code is [[Wc|here]]. | ||
| + | |||
| + | [http://groups.google.com/group/fa.haskell/browse_thread/thread/4133fa71ce97eb0e/fef34d1c3943bbe0#fef34d1c3943bbe0 A discussion] of the fastest way to parse a file of numbers, comparing various approaches using ByteStrings. | ||
Current revision
| Haskell Performance Resource
Constructs: Techniques: |
Contents |
1 Strings
Sometimes the cost of representing strings as lists of Char can be too much. In this case, you can instead use packed strings. There are a number of options:
- One of the packed string libraries, for example Data.ByteString
- Unboxed arrays of Word8 or Char
- Ptrs to foreign malloced Word8 buffers
The packed string libraries have the benefit over arrays of Word8 or Char types, in that they provide the usual list-like operations.
Some interesting results for Data.ByteString are documented here. In particular, it compares FPS against the existing PackedString and [Char] functions, and is used successfully with 1 terabyte strings.
2 Example
Pete Chown asked the question:
I want to read a text file. As an example, let's use /usr/share/dict/words and try to print out the last line of the file.
The python version completes in around 0.05s.
2.1 Attempt 1 : [Char]
import System.IO main = readFile "/usr/share/dict/words" >>= putStrLn.last.lines
Run in hugs, this program took several seconds to complete. Problem: interpreted (solution, use a Haskell compiler). Compiled, the program completes in a fairly quick 0.2s. Still, we can do better.
2.2 Attempt 2 : Data.ByteString
Using ByteString, we get:
import qualified Data.ByteString as B import IO main = B.readFile "/usr/share/dict/words" >>= B.putStr . last . B.lines
Runs in 0.063s
2.3 Attempt 3 : No Lists
Avoid splitting the file into lists at all, and just keep a single buffer (as a C programmer would perhaps do):
import qualified Data.ByteString as P import Maybe import IO main = P.readFile "/usr/share/dict/words" >>= P.putStrLn . snd . fromJust . P.breakLast '\n'
Runs in 0.013s
2.4 Related work
An extended tutorial on using PackedStrings/ByteStrings for high performance string manipulating code is here.
A discussion of the fastest way to parse a file of numbers, comparing various approaches using ByteStrings.
