Change clindex so it can use the rust nodemap for node lookups and partial
match. By default, the code runs in a "verify" mode that compares the rust
nodemap against the original nodemap. Once we gain more confident, we can
drop the support of the original nodemap (so it does not build a radix
tree).
After this, there is no need to enable perftweaks.cachenoderevs or
fastpartialmatch.
Performance wise, the nodemap seems to be a bit faster than revlog.c trie.
The former takes 91% (+/-5%) of the time needed for the latter. That was
tested by running the following script 20 times on fbsource:
from mercurial.cext import parsers
from hgext3rd.rust import indexes
import contextlib, os
m = {}
@contextlib.contextmanager
def measure(name):
    utime, stime, cutime, cstime, elapsed = os.times()
    try:
        yield
    finally:
        utime2, stime2, cutime, cstime, elapsed2 = os.times()
        print('%14s: User %.3f  Sys %.3f  Real %.3f'
              % (name, utime2 - utime, stime2 - stime, elapsed2 - elapsed))
        m[name] = elapsed2 - elapsed
cl = open('00changelog.i').read()
with measure('nodemap'):
    nm = indexes.nodemap(cl, indexes.nodemap.emptyindexbuffer())
    nm.partialmatch('da0443cd533f4073e8d0e324d55')
with measure('revlog index'):
    idx = parsers.index(cl, False)
    idx.partialmatch('da0443cd533f4073e8d0e324d55')
print('nodemap: %.2f revlog' % (m['nodemap'] / m['revlog index']))
And we're relying on the mmap config to make this fast right?