<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Somewhat related:</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">I was looking in emacs's version control support for hg (they run into a bug with hg parent with evolve, <a href="https://lists.gnu.org/archive/html/bug-gnu-emacs/2019-07/msg00349.html" style="font-family:Arial,Helvetica,sans-serif">https://lists.gnu.org/archive/html/bug-gnu-emacs/2019-07/msg00349.html</a>) and noticed that they have both a parser for the dirstate and for the hgignore, written in elisp, for speed: <a href="https://github.com/emacs-mirror/emacs/blob/f744797af1dd73a547dd204d7e79f084e6508517/lisp/vc/vc-hg.el#L582-L1053" style="font-family:Arial,Helvetica,sans-serif">https://github.com/emacs-mirror/emacs/blob/f744797af1dd73a547dd204d7e79f084e6508517/lisp/vc/vc-hg.el#L582-L1053</a>, <a href="https://github.com/emacs-mirror/emacs/commit/de76a167dc09dc695a5acebabb7ab354a6bf556e" style="font-family:Arial,Helvetica,sans-serif">https://github.com/emacs-mirror/emacs/commit/de76a167dc09dc695a5acebabb7ab354a6bf556e</a> ! And elisp is not exactly known to be fast.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">I looked in vc-git quickly, and they don't seem to do this sort of things, so I think they'd use hg status -A file, if it was faster. The commit message mentions large repos, but that seems weird as they call hg status -A file, which should not be very dependent on repo size. But regardless of whether it's cost of status in large repos or startup cost, they both get improved the more rust there is in hg status.<br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">In short: one more reason for putting rust in status, given the non trivial lengths that hg users go to otherwise.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Feb 15, 2019 at 2:39 PM Valentin Gatien-Baron <<a href="mailto:vgatien-baron@janestreet.com">vgatien-baron@janestreet.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_default"><font face="arial, helvetica, sans-serif">Hello,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">I wrote a fraction of hg status in rust, just the minimum needed to</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">compare current revision and working copy with few of the flags and</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">config settings supported. As you can imagine, the goal was better</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">performance.  Before trying to upstream bits of this, I figured I'd</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">check there's interest for this change in particular, or this kind</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">of changes in general (I suspect rust would bring significant</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">improvements to hg cat or hg files). The rest of this mail is more</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">details.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">While the implementation doesn't handle every uncommon situation right</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">and could use some serious cleanup, it's an interesting performance</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">improvement. In a repository with 100k tracked files and 500k ignored</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">files, in the best case and measuring on a good machine:</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">- hg-rs st takes ~50ms</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">- hg-rs st -mard takes ~14ms</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">- hg-rs st -u takes ~39ms</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">By contrast, hg+chg+fsmonitor's best case is 110ms regardless of</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">flags. Without fsmonitor, we're talking about 2.4s for hg st or hg st</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">-u, and 400ms for hg st -mard. As a baseline, hg st --syntax-error</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">takes 12ms.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">A ratio of x2 compared with fsmonitor+chg is nice, but while neither</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">best case is what you get all the time, fsmonitor degrades pretty</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">badly, oftentimes in hard to understand ways, making for an</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">unpredictable experience that is frequently bad.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Say you change the hgignore, the rust version will take 300ms, the</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">fsmonitor version will take 4.4s (I think 2s timeout + 2.4s regular</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">status).</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Say you remove a directory at the root of the repository, 50ms rust</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">vs 4.4s fsmonitor.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Say you haven't used a particular share in some time, you may well see</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">1s rust vs 4.4s fsmonitor.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">So I think there's a lot of value in having status without fsmonitor</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">going much faster:</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">- increase significantly the scale at which fsmonitor is needed</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">- improve the bad cases of fsmonitor (or even the fast path depending</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">on how things are made to work together)</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Regards,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Valentin Gatien-Baron</font></div><div class="gmail_default"><br></div></div></div></div>
</blockquote></div>