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