contrib/perf.py
changeset 36766 d382344c69aa
parent 36360 c25290b98190
child 37269 14cd5290c4e6
equal deleted inserted replaced
36765:04d64163039a 36766:d382344c69aa
   937         for p in s.fncache.entries:
   937         for p in s.fncache.entries:
   938             s.encode(p)
   938             s.encode(p)
   939     timer(d)
   939     timer(d)
   940     fm.end()
   940     fm.end()
   941 
   941 
   942 def _bdiffworker(q, ready, done):
   942 def _bdiffworker(q, blocks, xdiff, ready, done):
   943     while not done.is_set():
   943     while not done.is_set():
   944         pair = q.get()
   944         pair = q.get()
   945         while pair is not None:
   945         while pair is not None:
   946             mdiff.textdiff(*pair)
   946             if xdiff:
       
   947                 mdiff.bdiff.xdiffblocks(*pair)
       
   948             elif blocks:
       
   949                 mdiff.bdiff.blocks(*pair)
       
   950             else:
       
   951                 mdiff.textdiff(*pair)
   947             q.task_done()
   952             q.task_done()
   948             pair = q.get()
   953             pair = q.get()
   949         q.task_done() # for the None one
   954         q.task_done() # for the None one
   950         with ready:
   955         with ready:
   951             ready.wait()
   956             ready.wait()
   952 
   957 
   953 @command('perfbdiff', revlogopts + formatteropts + [
   958 @command('perfbdiff', revlogopts + formatteropts + [
   954     ('', 'count', 1, 'number of revisions to test (when using --startrev)'),
   959     ('', 'count', 1, 'number of revisions to test (when using --startrev)'),
   955     ('', 'alldata', False, 'test bdiffs for all associated revisions'),
   960     ('', 'alldata', False, 'test bdiffs for all associated revisions'),
   956     ('', 'threads', 0, 'number of thread to use (disable with 0)'),
   961     ('', 'threads', 0, 'number of thread to use (disable with 0)'),
       
   962     ('', 'blocks', False, 'test computing diffs into blocks'),
       
   963     ('', 'xdiff', False, 'use xdiff algorithm'),
   957     ],
   964     ],
   958 
   965 
   959     '-c|-m|FILE REV')
   966     '-c|-m|FILE REV')
   960 def perfbdiff(ui, repo, file_, rev=None, count=None, threads=0, **opts):
   967 def perfbdiff(ui, repo, file_, rev=None, count=None, threads=0, **opts):
   961     """benchmark a bdiff between revisions
   968     """benchmark a bdiff between revisions
   967 
   974 
   968     With ``--alldata``, assume the requested revision is a changeset and
   975     With ``--alldata``, assume the requested revision is a changeset and
   969     measure bdiffs for all changes related to that changeset (manifest
   976     measure bdiffs for all changes related to that changeset (manifest
   970     and filelogs).
   977     and filelogs).
   971     """
   978     """
       
   979     opts = pycompat.byteskwargs(opts)
       
   980 
       
   981     if opts['xdiff'] and not opts['blocks']:
       
   982         raise error.CommandError('perfbdiff', '--xdiff requires --blocks')
       
   983 
   972     if opts['alldata']:
   984     if opts['alldata']:
   973         opts['changelog'] = True
   985         opts['changelog'] = True
   974 
   986 
   975     if opts.get('changelog') or opts.get('manifest'):
   987     if opts.get('changelog') or opts.get('manifest'):
   976         file_, rev = None, file_
   988         file_, rev = None, file_
   977     elif rev is None:
   989     elif rev is None:
   978         raise error.CommandError('perfbdiff', 'invalid arguments')
   990         raise error.CommandError('perfbdiff', 'invalid arguments')
   979 
   991 
       
   992     blocks = opts['blocks']
       
   993     xdiff = opts['xdiff']
   980     textpairs = []
   994     textpairs = []
   981 
   995 
   982     r = cmdutil.openrevlog(repo, 'perfbdiff', file_, opts)
   996     r = cmdutil.openrevlog(repo, 'perfbdiff', file_, opts)
   983 
   997 
   984     startrev = r.rev(r.lookup(rev))
   998     startrev = r.rev(r.lookup(rev))
  1005 
  1019 
  1006     withthreads = threads > 0
  1020     withthreads = threads > 0
  1007     if not withthreads:
  1021     if not withthreads:
  1008         def d():
  1022         def d():
  1009             for pair in textpairs:
  1023             for pair in textpairs:
  1010                 mdiff.textdiff(*pair)
  1024                 if xdiff:
       
  1025                     mdiff.bdiff.xdiffblocks(*pair)
       
  1026                 elif blocks:
       
  1027                     mdiff.bdiff.blocks(*pair)
       
  1028                 else:
       
  1029                     mdiff.textdiff(*pair)
  1011     else:
  1030     else:
  1012         q = util.queue()
  1031         q = util.queue()
  1013         for i in xrange(threads):
  1032         for i in xrange(threads):
  1014             q.put(None)
  1033             q.put(None)
  1015         ready = threading.Condition()
  1034         ready = threading.Condition()
  1016         done = threading.Event()
  1035         done = threading.Event()
  1017         for i in xrange(threads):
  1036         for i in xrange(threads):
  1018             threading.Thread(target=_bdiffworker, args=(q, ready, done)).start()
  1037             threading.Thread(target=_bdiffworker,
       
  1038                              args=(q, blocks, xdiff, ready, done)).start()
  1019         q.join()
  1039         q.join()
  1020         def d():
  1040         def d():
  1021             for pair in textpairs:
  1041             for pair in textpairs:
  1022                 q.put(pair)
  1042                 q.put(pair)
  1023             for i in xrange(threads):
  1043             for i in xrange(threads):