<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">

<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<meta name=Generator content="Microsoft Word 12 (filtered medium)">
<style>
<!--
 /* Font Definitions */
 @font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:Tahoma;
        panose-1:2 11 6 4 3 5 4 4 2 4;}
 /* Style Definitions */
 p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        margin-bottom:.0001pt;
        font-size:12.0pt;
        font-family:"Times New Roman","serif";}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:purple;
        text-decoration:underline;}
span.apple-style-span
        {mso-style-name:apple-style-span;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri","sans-serif";
        color:#1F497D;}
.MsoChpDefault
        {mso-style-type:export-only;}
@page Section1
        {size:612.0pt 792.0pt;
        margin:72.0pt 72.0pt 72.0pt 72.0pt;}
div.Section1
        {page:Section1;}
-->
</style>
<!--[if gte mso 9]><xml>
 <o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
 <o:shapelayout v:ext="edit">
  <o:idmap v:ext="edit" data="1" />
 </o:shapelayout></xml><![endif]-->
</head>

<body lang=EN-GB link=blue vlink=purple>

<div class=Section1>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Bryan<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>It’s good news that the HEAD is better.  <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>To be honest I’m not terribly enthusiastic about trying to nail
down exactly what’s happening in 6.10 and 6.12 because, although they are
indeed the compilers people will be using, it’s otherwise wasted work because
the HEAD is so different.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Can you try with 6.12 and see if you can find a recipe that does
well enough?  If you get desperate (ie there’s a huge perf bump that you can’t
eliminate) then I’ll certainly try to help.<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Meanwhile, I don’t know why 6.10 is faster than HEAD (by 25%
too) and I’d like to understand that.  Can you submit a Trac ticket saying how
to reproduce?  You might need to bundle up the library too, to make sure we can
reproduce it precisely.  <o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Thanks<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'>Simon<o:p></o:p></span></p>

<p class=MsoNormal><span style='font-size:11.0pt;font-family:"Calibri","sans-serif";
color:#1F497D'><o:p>&nbsp;</o:p></span></p>

<div style='border:none;border-left:solid blue 1.5pt;padding:0cm 0cm 0cm 4.0pt'>

<div>

<div style='border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0cm 0cm 0cm'>

<p class=MsoNormal><b><span lang=EN-US style='font-size:10.0pt;font-family:
"Tahoma","sans-serif"'>From:</span></b><span lang=EN-US style='font-size:10.0pt;
font-family:"Tahoma","sans-serif"'> Bryan O'Sullivan
[mailto:bos@serpentine.com] <br>
<b>Sent:</b> 17 November 2009 07:14<br>
<b>To:</b> Simon Peyton-Jones<br>
<b>Cc:</b> glasgow-haskell-users@haskell.org<br>
<b>Subject:</b> Re: Inliner behaviour - tiny changes lead to huge performance
differences<o:p></o:p></span></p>

</div>

</div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

<div>

<p class=MsoNormal>On Fri, Nov 13, 2009 at 12:26 AM, Simon Peyton-Jones &lt;<a
href="mailto:simonpj@microsoft.com" target="_blank">simonpj@microsoft.com</a>&gt;
wrote:<o:p></o:p></p>

<div>

<p class=MsoNormal>&nbsp;<o:p></o:p></p>

</div>

<blockquote style='border:none;border-left:solid #CCCCCC 1.0pt;padding:0cm 0cm 0cm 6.0pt;
margin-left:4.8pt;margin-right:0cm'>

<p class=MsoNormal>My goal is for INLINE pragmas to be very predictable.
&nbsp;I can't decode your message enough to offer any insights; thank you
Roman, who is closer to it, for helping.<o:p></o:p></p>

</blockquote>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Things are considerably different with HEAD than with 6.10.4.
HEAD is indeed spotting and exploiting many of the opportunities for inlining,
while 6.10.4 is a bit of a morass. The difference is stark: my test program
runs in 0.7 seconds with HEAD, and 1.2 with 6.10.4.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>Here's a rough table of my results:<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-family:"Courier New"'>6.10.4 &nbsp; 8.39
seconds</span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><span style='font-family:"Courier New"'>HEAD &nbsp; &nbsp;
0.50</span><o:p></o:p></p>

</div>

<div>

<div>

<p class=MsoNormal><span style='font-family:"Courier New"'>HEAD* &nbsp;
&nbsp;0.50</span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

</div>

<div>

<p class=MsoNormal><span class=apple-style-span><span style='font-family:"Courier New"'>6.10.4*
&nbsp;0.39</span></span><span style='font-family:"Arial","sans-serif"'><o:p></o:p></span></p>

</div>

</div>

<div>

<p class=MsoNormal><span class=apple-style-span><span style='font-family:"Courier New"'>6.10.4**
0.34</span></span><o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>The asterisk above denotes the removal of a single INLINE
pragma from the text library.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal>The doubled asterisk denotes the removal of a piece of
indirection: instead of length defined as lengthI and both marked as INLINE, I
manually inlined lengthI into the body of length.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>For your amusement, GNU &quot;wc -m&quot; takes 1.1 seconds
to count the number of Unicode characters in the same file, so I think that our
combination of performance and brevity is <i>wonderful</i>. Thanks!<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>So HEAD is far better than 6.10.4 (yay!), but a little
tweaking of the library code makes the 6.10.4 code faster again (boo!). The
HEAD inliner seems, as you hoped, to be behaving far more predictably than its
predecessor.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>If you'd like to investigate the remaining performance
discrepancy between 6.10.4 and HEAD, I'll create a Trac ticket with
instructions on how to reproduce my numbers.<o:p></o:p></p>

</div>

<div>

<p class=MsoNormal><o:p>&nbsp;</o:p></p>

</div>

<div>

<p class=MsoNormal>In the time between now and the release of 6.14, I wonder
what to do. I'm building 6.12 to see how it fares, but my experience with 6.10
so far suggests that the behaviour of the 6.12 inliner will be fragile and
difficult to understand, which is a bit of a shame. On that older code base, it
seems that I can get really good fused performance, or okay unfused
performance, but not both.<o:p></o:p></p>

</div>

</div>

</div>

</div>

</body>

</html>