I never looked into why, but you can observe that e.g. `fmap (decodeUtf8) . B.readFile` is several times as fast as `T.readFile` . It's the same with the other material in `Data.Text.(Lazy.)IO`. I think this is why he doesn't include the IO functions in `Data.Text`: the official IO is via ByteString using the encoding and decoding functions, same as with pipes-text
import qualified Data.Text as T
import qualified Data.Text.Encoding as T
import qualified Data.ByteString.Char8 as B
import System.Environment
main = do
x <- getArgs
case x of
[] -> do
txt <- T.readFile "txt/words3d.txt"
print $ T.length txt
_ -> do
bs <- B.readFile "txt/words3d.txt"
print $ T.length (T.decodeUtf8 bs)