glguy/utf8-string — pull request #4 by TomMD (2011-11-17 21:28:33+00:00)
Title: Minor performance improvements

Performance improvements: inline decode, specialize take and drop, add strictness annotations.

When considering a simple benchmark [1]:

let p = ((== "en") . U.take 2)
print . length . filter p . U.lines =<< L.readFile . head =<< getArgs

It's apparent that we are underperforming (compare to the shell script
solution, this take twice as long). The accumulator of splitAt wasn't
strict (used bang patterns). Also, even with -O2, the construction /
destruction of the tuple for take & drop's lifting of splitAt wasn't
being optimized away. Perhaps more investigation should be done re:
GHC, but the cheap solution is to just duplicate code for take and
drop, which is what this patch does.

Original: user 0m1.704s
Final: user 0m1.092s

[1] http://stackoverflow.com/questions/8172889/quickly-parse-large-utf-8-text-file-in-haskell