Karl Fogel writes:
 > Michael Wood <mwood@its.uct.ac.za> writes:
 > > > + Mike Pilato points out that the problem may not be the one-byte reads,
 > > > + since that I/O is presumably buffered.  So the first thing is to do
 > >                       ^^^^^^^^^^
 > > 
 > > Is it though?  Haven't checked.  This assumption just jumped out at me
 > > :)
 > 
 > Yup, that wasn't an assertion, it was merely a note *not* to blindly
 > assume that I/O is the problem.
Two data points:
in svn_subst_copy_and_translate, the source file used for translation
is opened as follows:
  SVN_ERR (svn_io_file_open (&s, src, APR_READ | APR_BUFFERED,
                             APR_OS_DEFAULT, pool));
which tells me that it _should_ be buffered, right?
Secondly, on my FreeBSD box, checking out the subversion source over
http gives the following profile info for svn_subst_translate_stream
                                  called/total       parents
index  %time    self descendents  called+self    name           index
                                  called/total       children
                0.48        4.18     730/730         svn_subst_copy_and_translate [6]
[7]     26.0    0.48        4.18     730         svn_subst_translate_stream [7]
                0.25        1.98 9630507/9925261     translate_write [13]
                0.22        1.65 9968018/9968018     svn_stream_read [16]
                0.01        0.07  294754/294754      translate_newline [102]
                0.00        0.00    1460/3898        svn_stream_close [743]
                0.00        0.00     770/770         translate_keyword [758]
translate_write doesn't really do much, but it's called an awful lot.
I replaced it with a shameful hack which just buffers all the bytes
and calls svn_stream_write once at the end of the file, and got:
                0.58        2.02     731/731         svn_subst_copy_and_translate [11]
[12]    15.7    0.58        2.02     731         svn_subst_translate_stream [12]
                0.22        1.63 9975019/9975019     svn_stream_read [15]
                0.17        0.00 9637151/9932110     translate_write [73]
                0.00        0.01  294959/294959      translate_newline [276]
                0.00        0.00    1462/3903        svn_stream_close [390]
                0.00        0.00     731/13248       svn_stream_write [215]
                0.00        0.00     770/770         translate_keyword [670]
Of course, that wouldn't work as a general solution, but we could
consider having a buffer in svn_subst_translate_stream that we flush
to disk every n characters, to avoid having to descend the call chain
into the depths of apr for every byte.  Something similar could be
done for svn_stream_read, but that's more work.
---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Mon Apr 14 19:23:19 2003