D2626: xdiff: use xxhash in xdiff
quark (Jun Wu)
phabricator at mercurial-scm.org
Sat Mar 3 21:14:03 EST 2018
quark requested changes to this revision.
quark added a comment.
This revision now requires changes to proceed.
It seems xxhash can make things slower if the line is short.
## test case
open('a','w').write(''.join('%s\n' % (i % 100000) for i in xrange(10000000)))
open('b','w').write(''.join('%s\n' % (i % 100000) for i in xrange(10000001)))
## before xxhash
./xdiff /tmp/[ab] &> /dev/null 0.67s user 0.21s system 99% cpu 0.875 total
## after xxhash
./xdiff /tmp/[ab] &> /dev/null 2.86s user 0.43s system 98% cpu 3.315 total
The memchr change does not change much - it's still about 3 seconds on my machine.
Code I use for testing:
// contrib/xdiff/xdiff.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include "mercurial/thirdparty/xdiff/xdiff.h"
#define abort(...) \
{ \
fprintf(stderr, __VA_ARGS__); \
exit(-1); \
}
char buf[4096000];
void readfile(const char *path, mmfile_t *file)
{
memset(file, 0, sizeof(*file));
FILE *fp = fopen(path, "r");
if (!fp) {
abort("cannot open %s\n", path);
}
while (!feof(fp)) {
size_t size = fread(buf, 1, sizeof buf, fp);
if (size > 0) {
size_t new_size = file->size + size;
file->ptr = realloc(file->ptr, new_size);
if (!file->ptr) {
abort("cannot allocate\n");
}
memcpy(file->ptr + file->size, buf, size);
file->size = new_size;
}
}
fclose(fp);
}
static int xdiff_outf(void *priv_, mmbuffer_t *mb, int nbuf)
{
int i;
for (i = 0; i < nbuf; i++) {
write(STDOUT_FILENO, mb[i].ptr, mb[i].size);
}
return 0;
}
int main(int argc, char const *argv[])
{
if (argc < 3) {
abort("usage: %s FILE1 FILE2\n", argv[0]);
}
mmfile_t a, b;
readfile(argv[1], &a);
readfile(argv[2], &b);
xpparam_t xpp = {
0, /* flags */
NULL, /* anchors */
0, /* anchors_nr */
};
xdemitconf_t xecfg = {
3, /* ctxlen */
0, /* interhunkctxlen */
0, /* flags */
NULL, /* find_func */
NULL, /* find_func_priv */
NULL, /* hunk_consume_func */
};
xdemitcb_t ecb = {
0, /* priv */
&xdiff_outf, /* outf */
};
xdl_diff(&a, &b, &xpp, &xecfg, &ecb);
free(a.ptr);
free(b.ptr);
return 0;
}
## contrib/xdiff/Makefile
xdiff: ../../mercurial/thirdparty/xdiff/*.c xdiff.c
gcc -O2 -g -std=c99 -I../.. -I../../mercurial/thirdparty/xdiff -I../../mercurial -o $@ $^
clean:
-rm -f xdiff
REPOSITORY
rHG Mercurial
REVISION DETAIL
https://phab.mercurial-scm.org/D2626
To: indygreg, #hg-reviewers, quark
Cc: quark, mercurial-devel
More information about the Mercurial-devel
mailing list