revset: remove existence check from min() and max()
min() and max() would first do an existence check. Unfortunately existence
checks can be slow in certain situations (like if the smartset is a list, and
quickly iterable in both ascending and descending directions, then doing an
existence check will start from the bottom, even if you want to check the
max()).
The fix is to not do the check, and just handle the error if it happens. In a
large repo, this speeds up:
hg log -r 'max(parents(. + .^) - (. + .^) & ::master)'
from 3.5s to 0.85s. That revset is contrived and just for testing. In our
real case we used 'bundle()' in place of '. + .^'
Interesting perf numbers for the revset benchmarks:
max(draft() and ::tip) => 0.027s to 0.0005s
max(author(lmoscovicz)) => 2.48s to 0.57s
min doesn't show any perf changes, but changing it as well will prevent a perf
regression in my next patch.
Result from revset benchmark
revset #0: draft() and ::tip
min max
0) 0.001971 0.001991
1) 0.001965 0.000428 21%
revset #1: ::tip and draft()
min max
0) 0.002017 0.001912
1) 0.001896 94% 0.000421 22%
revset #2: author(lmoscovicz)
min max
0) 1.049033 1.358913
1) 1.042508 0.319824 23%
revset #3: author(lmoscovicz) or author(mpm)
min max
0) 1.042512 1.367432
1) 1.019750 0.327750 23%
revset #4: author(mpm) or author(lmoscovicz)
min max
0) 1.050135 0.324924
1) 1.070698 0.319913
revset #5: roots((tip~100::) - (tip~100::tip))
min max
0) 0.000671 0.001018
1) 0.000605 90% 0.000946 92%
revset #6: roots((0::) - (0::tip))
min max
0) 0.149714 0.152369
1) 0.098677 65% 0.100374 65%
revset #7: (20000::) - (20000)
min max
0) 0.051019 0.042747
1) 0.035586 69% 0.016267 38%
SVN-fs-dump-format-version: 2
UUID: 97a955ef-0269-44f2-a58f-abd4ad400b2b
Revision-number: 0
Prop-content-length: 56
Content-length: 56
K 8
svn:date
V 27
2010-11-26T18:01:12.912988Z
PROPS-END
Revision-number: 1
Prop-content-length: 108
Content-length: 108
K 7
svn:log
V 7
initial
K 10
svn:author
V 7
pmezard
K 8
svn:date
V 27
2010-11-26T18:01:13.106933Z
PROPS-END
Node-path: branches
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
Node-path: trunk
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
Node-path: trunk/a
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 2
Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
Content-length: 12
PROPS-END
a
Node-path: trunk/d
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
Node-path: trunk/d/b
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 2
Text-content-md5: 3b5d5c3712955042212316173ccf37be
Text-content-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
Content-length: 12
PROPS-END
b
Node-path: trunk/d2
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
Node-path: trunk/d2/a
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 2
Text-content-md5: 60b725f10c9c85c70d97880dfe8191b3
Text-content-sha1: 3f786850e387550fdab836ed7e6dc881de23001b
Content-length: 12
PROPS-END
a
Node-path: trunk/dlink
Node-kind: file
Node-action: add
Prop-content-length: 33
Text-content-length: 6
Text-content-md5: cca56829f18345718a4980bb02b6d8c3
Text-content-sha1: 7c54cc5d472b78c94a04382df34b0f4f0f4f2d49
Content-length: 39
K 11
svn:special
V 1
*
PROPS-END
link d
Node-path: trunk/dlink2
Node-kind: file
Node-action: add
Prop-content-length: 33
Text-content-length: 6
Text-content-md5: cca56829f18345718a4980bb02b6d8c3
Text-content-sha1: 7c54cc5d472b78c94a04382df34b0f4f0f4f2d49
Content-length: 39
K 11
svn:special
V 1
*
PROPS-END
link d
Node-path: trunk/dlink3
Node-kind: file
Node-action: add
Prop-content-length: 33
Text-content-length: 6
Text-content-md5: cca56829f18345718a4980bb02b6d8c3
Text-content-sha1: 7c54cc5d472b78c94a04382df34b0f4f0f4f2d49
Content-length: 39
K 11
svn:special
V 1
*
PROPS-END
link d
Revision-number: 2
Prop-content-length: 117
Content-length: 117
K 7
svn:log
V 15
clobber symlink
K 10
svn:author
V 7
pmezard
K 8
svn:date
V 27
2010-11-26T18:01:14.073483Z
PROPS-END
Node-path: trunk/dlink3
Node-kind: file
Node-action: change
Prop-content-length: 10
Text-content-length: 2
Text-content-md5: e29311f6f1bf1af907f9ef9f44b8328b
Text-content-sha1: e983f374794de9c64e3d1c1de1d490c0756eeeff
Content-length: 12
PROPS-END
d
Revision-number: 3
Prop-content-length: 106
Content-length: 106
K 7
svn:log
V 8
clobber1
K 10
svn:author
V 4
evil
K 8
svn:date
V 27
2010-11-26T18:01:16.205184Z
PROPS-END
Node-path: trunk/a
Node-kind: dir
Node-action: delete
Node-path: trunk/a
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 2
Node-copyfrom-path: trunk/d
Node-path: trunk/dlink
Node-kind: dir
Node-action: delete
Node-path: trunk/dlink
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 2
Node-copyfrom-path: trunk/d
Revision-number: 4
Prop-content-length: 106
Content-length: 106
K 7
svn:log
V 8
clobber2
K 10
svn:author
V 4
evil
K 8
svn:date
V 27
2010-11-26T18:01:16.395962Z
PROPS-END
Node-path: trunk/dlink3
Node-kind: file
Node-action: delete
Node-path: trunk/dlink3
Node-kind: file
Node-action: add
Node-copyfrom-rev: 3
Node-copyfrom-path: trunk/dlink2
Text-copy-source-md5: cca56829f18345718a4980bb02b6d8c3
Text-copy-source-sha1: 7c54cc5d472b78c94a04382df34b0f4f0f4f2d49
Revision-number: 5
Prop-content-length: 106
Content-length: 106
K 7
svn:log
V 5
adddb
K 10
svn:author
V 7
pmezard
K 8
svn:date
V 27
2010-11-26T18:01:16.445072Z
PROPS-END
Node-path: trunk/d2/b
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 2
Text-content-md5: 3b5d5c3712955042212316173ccf37be
Text-content-sha1: 89e6c98d92887913cadf06b2adb97f26cde4849b
Content-length: 12
PROPS-END
b
Revision-number: 6
Prop-content-length: 107
Content-length: 107
K 7
svn:log
V 6
branch
K 10
svn:author
V 7
pmezard
K 8
svn:date
V 27
2010-11-26T18:01:19.075874Z
PROPS-END
Node-path: branches/branch
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 5
Node-copyfrom-path: trunk
Node-path: branches/branch/d2/c
Node-kind: file
Node-action: add
Prop-content-length: 10
Text-content-length: 2
Text-content-md5: 2cd6ee2c70b0bde53fbe6cac3c8b8bb1
Text-content-sha1: 2b66fd261ee5c6cfc8de7fa466bab600bcfe4f69
Content-length: 12
PROPS-END
c
Node-path: branches/branch/d2/b
Node-action: delete
Revision-number: 7
Prop-content-length: 109
Content-length: 109
K 7
svn:log
V 10
clobberdir
K 10
svn:author
V 4
evil
K 8
svn:date
V 27
2010-11-26T18:01:21.202158Z
PROPS-END
Node-path: trunk/d2
Node-kind: dir
Node-action: delete
Node-path: trunk/d2
Node-kind: dir
Node-action: add
Node-copyfrom-rev: 6
Node-copyfrom-path: branches/branch/d2