annotate mercurial/cffi/bdiffbuild.py @ 50317:af776c3d5c3e stable

debugdeltachain: stop summing the same chain over and over Before this patch, delta chain size was computed from scratch for each chain, disregarding the fact very likely already computed the same of length-1 prefix for another revisions. We not cache delta chain size and shortcut the computation when we see them. Just for my mercurial-devel clone, this move the computation from about 17.5 second to about 4.8 seconds.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 21 Mar 2023 15:44:38 +0000
parents 6000f5b25c9b
children f4733654f144
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29833
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
1 import cffi
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
2 import os
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
3
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
4 ffi = cffi.FFI()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 36948
diff changeset
5 with open(
43668
53607fd3ec6c cffi: fix build on Python 3
Manuel Jacob <me@manueljacob.de>
parents: 43077
diff changeset
6 os.path.join(os.path.join(os.path.dirname(__file__), '..'), 'bdiff.c')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 36948
diff changeset
7 ) as f:
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 36948
diff changeset
8 ffi.set_source(
43668
53607fd3ec6c cffi: fix build on Python 3
Manuel Jacob <me@manueljacob.de>
parents: 43077
diff changeset
9 "mercurial.cffi._bdiff", f.read(), include_dirs=['mercurial']
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 36948
diff changeset
10 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 36948
diff changeset
11 ffi.cdef(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 36948
diff changeset
12 """
29833
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
13 struct bdiff_line {
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
14 int hash, n, e;
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
15 ssize_t len;
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
16 const char *l;
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
17 };
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
18
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
19 struct bdiff_hunk;
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
20 struct bdiff_hunk {
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
21 int a1, a2, b1, b2;
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
22 struct bdiff_hunk *next;
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
23 };
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
24
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
25 int bdiff_splitlines(const char *a, ssize_t len, struct bdiff_line **lr);
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
26 int bdiff_diff(struct bdiff_line *a, int an, struct bdiff_line *b, int bn,
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
27 struct bdiff_hunk *base);
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
28 void bdiff_freehunks(struct bdiff_hunk *l);
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
29 void free(void*);
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 36948
diff changeset
30 """
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 36948
diff changeset
31 )
29833
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
32
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
33 if __name__ == '__main__':
a8933d992a71 bdiff: implement cffi version of blocks
Maciej Fijalkowski <fijall@gmail.com>
parents:
diff changeset
34 ffi.compile()