On Wed, 2010-04-21, Stefan Fuhrmann wrote: > Philip Martin wrote: > > Stefan Fuhrmann <[email protected]> writes: > > Philip Martin wrote: > >> Stefan Fuhrman <[email protected]> writes: > >>>> svn_cache_t lookup returns a copy of the value found. > >>>> For objects of variable size, this can be expensive. If you > >>>> checkout / export all N files of a specific directory, for > >>>> instance, every single path gets verified. The directory > >>>> information is cached for FSFS but the copy operation > >>>> will still be O(N). > >>>> > >>>> As a result, the whole check takes O(N2). The good > >>>> > >>> That sounds bad. Do you have any measurements to show how much > >>> improvement your patch gives? > >>> > >> Well, choose your N ;) For low square mean numbers of files > >> per folder as in TSVN and SVN, the gains were between 3 > >> and 4 percent of total "svn export" runtime. If you want me to, > >> I could run a test with 10k files in a folder (probably a realistic > >> upper limit). > > > > Sounds promising. In this case I think server performance is the more > > interesting. If you can be bothered then run a server, do a checkout > > of a 1K or a 10k directory (probably many times) and look at CPU or > > memory usage of the server. But if you are getting 3% on the client > > then the server is probably getting a bigger gain. > > > Took me a while to get to it but here are the results. > I created a format 5 FSFS repository with folders > containing 2^N almost empty files. Then I ran ls and > export on svn://localhost - with in svnserve patched > and non-patched variants. > > The following table shows the "real" part of "time svn ..." > on the client side. As far as I can tell, svnserve spawned > a child process for each command and that child process > was busy during the command execution (e.g. kept 1 core > @ 100% load). > > Files ls-1.7 ls-patched export-1.7 export-patched > 1 0.045s 0.046s 0.046s 0.045s > 2 0.045s 0.045s 0.046s 0.045s > 4 0.048s 0.045s 0.046s 0.047s > 8 0.045s 0.044s 0.085s 0.086s > 16 0.045s 0.046s 0.086s 0.086s > 32 0.049s 0.048s 0.091s 0.087s > 64 0.088s 0.089s 0.092s 0.100s > 128 0.098s 0.094s 0.104s 0.119s > 256 0.126s 0.107s 0.144s 0.154s > 512 0.208s 0.132s 0.218s 0.210s > 1024 0.350s 0.177s 0.390s 0.318s > 2048 0.899s 0.251s 0.970s 0.458s > 4096 3.058s 0.321s 3.413s 0.458s > 8192 11.322s 0.601s 11.712s 0.752s > 16384 44.282s 1.079s 44.234s 1.343s > > So, there is clearly a O(N^2) runtime that becomes relevant > at a few hundred entries in a folder. For the very small file > sizes (<20 bytes) used here, svn export is mainly limited > by server-side path validation.
A set of measurements like that is a *really* quick and convincing demonstration of the value of this patch. Thanks! - Julian > As for the patch itself, I think I will rewrite it to either allow > for multiple pins or to follow an svn_wc__call_with_write_lock- > like approach. > > -- Stefan^2. >

