<div dir="ltr">On #1.  The enticement is to give the json parser (or any other) an input port which is essentially a pipe from the http connection to the content parser, in this case Json.  If the parser (which in this case it is not)  a streaming parser then one can save buffering the entire content in mem.  Hence the avoidance of sucking the port into a string-port.<div>
<br></div><div style>It _is_ interesting that in the test case under discussion it is a 100Meg file.  (A single single object as well???)  So the fact that reading the entire 100 meg, wrap it in a string port is 15% faster than just handing the file port directly to the parser.   Mean peek/read char on a file port measurably slower than from a string port.  I&#39;m assuming the Racket runtime internally buffers text file reading, so why the big difference in performance?</div>
</div><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Jan 14, 2013 at 3:59 PM, Danny Yoo <span dir="ltr">&lt;<a href="mailto:dyoo@hashcollision.org" target="_blank">dyoo@hashcollision.org</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; From looking at the profile, we can trace that about 60% of the time<br>
&gt; is being spent in... regexp-try-match!  That sounds really unusual:<br>
&gt; lexing should not be the expensive part of this process...<br>
&gt;<br>
&gt; So perhaps it might be helpful to see if an alternative lexing<br>
&gt; strategy (perhaps using parser-tools/lex) will perform better.<br>
<br>
Ok, I looked at the problem a little more.  It appears that there are<br>
a few stupid-simple optimizations to the JSON library that we can do.<br>
I&#39;ve been able to cut down the time on my machine from an unoptimized<br>
run of 52 second to parse your file, to about 36 seconds.<br>
<br>
Here&#39;s the patch:<br>
<br>
<a href="https://github.com/dyoo/racket/commit/e8dc403217574754c57fa4bd95439abfb9b521ec" target="_blank">https://github.com/dyoo/racket/commit/e8dc403217574754c57fa4bd95439abfb9b521ec</a><br>
<br>
<br>
I haven&#39;t pushed to master just because I&#39;d like someone else to<br>
review the changes.  Also, I have not been able to find the unit tests<br>
for the json library.  Does anyone know where they are?<br>
<br>
<br>
Here&#39;s a summary of the changes.<br>
<br>
1.  First, pull all the content of the input port into a string port.<br>
This cut down the runtime from 52 seconds to 45 seconds.  (15%<br>
improvement)<br>
<br>
2.  Modified read-list so it avoids using regular expressions when<br>
simpler peek-char/read-char operations suffice.  Reduced the runtime<br>
from 45 seconds to 40 seconds.  (12% improvement)<br>
<br>
3.  Looked at the profiler, which pointed out that read-string was<br>
very expensive.  Looked and found the regular expression:<br>
<br>
    rx&quot;^(.*?)(\&quot;|\\\\(.))&quot;<br>
<br>
which is performance-hungry.  Replaced with a char-complement version<br>
to avoid the &quot;?&quot; part of the pattern:<br>
<br>
    #rx&quot;^([^\&quot;\\]*)(\&quot;|\\\\(.))&quot;<br>
<br>
which cut down the runtime from 40 seconds to 36 seconds.  (11% improvement)<br>
<br>
<br>
There still seems to be a lot of low-hanging fruit with regards to the<br>
use of regexp-try-catch, which is still taking 52% of the runtime,<br>
according to the profile here:<br>
<br>
     <a href="https://gist.github.com/4533369" target="_blank">https://gist.github.com/4533369</a><br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
</blockquote></div><br></div>