<div class="gmail_quote">On Sat, Aug 14, 2010 at 10:46 PM, Michael Snoyman <span dir="ltr">&lt;<a href="mailto:michael@snoyman.com">michael@snoyman.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<div dir="ltr"><div class="gmail_quote"><div class="im"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><br></blockquote></div><div>When I&#39;m writing a web app, my code is sitting on a Linux system where the default encoding is UTF-8, communicating with a database speaking UTF-8, receiving request bodies in UTF-8 and sending response bodies in UTF-8. So converting all of that data to UTF-16, just to be converted right back to UTF-8, does seem strange for that purpose.</div>
</div></div></blockquote><div><br></div><div>Bear in mind that much of the data you&#39;re working with can&#39;t be readily trusted. UTF-8 coming from the filesystem, the network, and often the database may not be valid. The cost of validating it isn&#39;t all that different from the cost of converting it to UTF-16.</div>
<div><br></div><div>And of course the internals of Data.Text are all fusion-based, so much of the time you&#39;re not going to be allocating UTF-16 arrays at all, but instead creating a pipeline of characters that are manipulated in a tight loop. This eliminates a lot of the additional copying that bytestring has to do, for instance.</div>
<div><br></div><div>To give you an idea of how competitive Data.Text can be compared to C code, this is the system&#39;s wc command counting UTF-8 characters in a modestly large file:</div><div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">
<div class="gmail_quote"><div><div>$ time wc -m huge.txt </div></div></div><div class="gmail_quote"><div><div>32443330</div></div></div><div class="gmail_quote"><div><div>real<span class="Apple-tab-span" style="white-space:pre">        </span>0.728s</div>
</div></div></blockquote><div class="gmail_quote"><div><br></div><div>This is Data.Text performing the same task:</div><div><br></div></div><blockquote class="webkit-indent-blockquote" style="margin: 0 0 0 40px; border: none; padding: 0px;">
<div class="gmail_quote"><div><div>$ time ./FileRead text huge.txt </div></div></div><div class="gmail_quote"><div><div>32443330</div></div></div><div class="gmail_quote"><div><div>real<span class="Apple-tab-span" style="white-space:pre">        </span>0.697s</div>
</div></div></blockquote><div class="gmail_quote"><div><br></div><div><br></div></div>