Page MenuHomePhabricator

revset: optimize "head() & draft()" to "heads(draft())"
ClosedPublic

Authored by quark on Nov 18 2017, 12:55 AM.

Details

Summary

head() has visible overhead if there are too many heads (ex. 10k+).
Usually when we only care about draft heads, heads(draft()) is better
since draft() are usually pre-calculated and the revset gets calculated as
draft() - parents(draft()), unrelated to the number of total heads.

Note that head() & draft() and heads(draft()) are not strictly
equivalent (ex, a head with a secret phase) so it's changing the behavior a
bit. The new behavior is probably more desirable - in both smartlog and
backup case, people do want to see/backup the draft head, regardless of
whether it has secret descendants or not.

This makes smartlogrevset take 50ms less:

Before:

148           | smartlogrevset                smartlog.py:438
117            \ revs (3 times)               localrepo.py:783
116             | mfunc (3 times)             revset.py:2202
116             | getset (3 times)            revset.py:92
116             | andset (2 times)            revset.py:165
116             | getset (4 times)            revset.py:92
 62              \ andset (2 times)           revset.py:165
 62               | getset (4 times)          revset.py:92
 78                \ func (3 times)           revset.py:235
 49                  \ head (2 times)         revset.py:1117
 49                    \ branchmap (4 times)  localrepo.py:953
 46                    \ <genexpr> (16348 times) revset.py:1126
 38                     | rev (16344 times)   changelog.py:353 <<<< too many heads
 67                  \ branch (2 times)       revset.py:465
 42                    \ wrapper (2 times)    localrepo.py:141
 42                     | revbranchcache (2 times) localrepo.py:959
 40                     | __init__            branchmap.py:354
 12                     | read (2 times)      vfs.py:78
 25                    \ branchmap (2 times)  localrepo.py:953
 25                \ andset                   revset.py:165
 30              \ func (2 times)             revset.py:235
 30               | notbackedup               backupcommands.py:302
 52               | _backupheads (2 times)    backupcommands.py:389
 28            \ _masterrev                   smartlog.py:426

After:

99       | smartlogrevset                    smartlog.py:438
69        \ revs (3 times)                   localrepo.py:783
68         | mfunc (3 times)                 revset.py:2202
68         | getset (3 times)                revset.py:92
68         | andset (2 times)                revset.py:165
68         | getset (4 times)                revset.py:92
13         | andset                          revset.py:165
13         | getset (2 times)                revset.py:92
27        \ _masterrev                       smartlog.py:426

Diff Detail

Repository
rFBHGX Facebook Mercurial Extensions
Lint
Automatic diff as part of commit; lint not applicable.
Unit
Automatic diff as part of commit; unit tests not applicable.

Event Timeline

quark created this revision.Nov 18 2017, 12:55 AM
Herald added a reviewer: Restricted Project. · View Herald TranscriptNov 18 2017, 12:55 AM
ikostia accepted this revision.Nov 21 2017, 1:26 AM
This revision is now accepted and ready to land.Nov 21 2017, 1:26 AM
durham accepted this revision.Nov 21 2017, 10:04 AM
This revision was automatically updated to reflect the committed changes.