##// END OF EJS Templates
perf: add a perfunidiff command for benchmarking unified diff speed...
Augie Fackler -
r35879:ed939545 default
parent child Browse files
Show More
@@ -1031,6 +1031,71 b' def perfbdiff(ui, repo, file_, rev=None,'
1031 with ready:
1031 with ready:
1032 ready.notify_all()
1032 ready.notify_all()
1033
1033
1034 @command('perfunidiff', revlogopts + formatteropts + [
1035 ('', 'count', 1, 'number of revisions to test (when using --startrev)'),
1036 ('', 'alldata', False, 'test unidiffs for all associated revisions'),
1037 ], '-c|-m|FILE REV')
1038 def perfunidiff(ui, repo, file_, rev=None, count=None, **opts):
1039 """benchmark a unified diff between revisions
1040
1041 This doesn't include any copy tracing - it's just a unified diff
1042 of the texts.
1043
1044 By default, benchmark a diff between its delta parent and itself.
1045
1046 With ``--count``, benchmark diffs between delta parents and self for N
1047 revisions starting at the specified revision.
1048
1049 With ``--alldata``, assume the requested revision is a changeset and
1050 measure diffs for all changes related to that changeset (manifest
1051 and filelogs).
1052 """
1053 if opts['alldata']:
1054 opts['changelog'] = True
1055
1056 if opts.get('changelog') or opts.get('manifest'):
1057 file_, rev = None, file_
1058 elif rev is None:
1059 raise error.CommandError('perfunidiff', 'invalid arguments')
1060
1061 textpairs = []
1062
1063 r = cmdutil.openrevlog(repo, 'perfunidiff', file_, opts)
1064
1065 startrev = r.rev(r.lookup(rev))
1066 for rev in range(startrev, min(startrev + count, len(r) - 1)):
1067 if opts['alldata']:
1068 # Load revisions associated with changeset.
1069 ctx = repo[rev]
1070 mtext = repo.manifestlog._revlog.revision(ctx.manifestnode())
1071 for pctx in ctx.parents():
1072 pman = repo.manifestlog._revlog.revision(pctx.manifestnode())
1073 textpairs.append((pman, mtext))
1074
1075 # Load filelog revisions by iterating manifest delta.
1076 man = ctx.manifest()
1077 pman = ctx.p1().manifest()
1078 for filename, change in pman.diff(man).items():
1079 fctx = repo.file(filename)
1080 f1 = fctx.revision(change[0][0] or -1)
1081 f2 = fctx.revision(change[1][0] or -1)
1082 textpairs.append((f1, f2))
1083 else:
1084 dp = r.deltaparent(rev)
1085 textpairs.append((r.revision(dp), r.revision(rev)))
1086
1087 def d():
1088 for left, right in textpairs:
1089 # The date strings don't matter, so we pass empty strings.
1090 headerlines, hunks = mdiff.unidiff(
1091 left, '', right, '', 'left', 'right')
1092 # consume iterators in roughly the way patch.py does
1093 b'\n'.join(headerlines)
1094 b''.join(sum((list(hlines) for hrange, hlines in hunks), []))
1095 timer, fm = gettimer(ui, opts)
1096 timer(d)
1097 fm.end()
1098
1034 @command('perfdiffwd', formatteropts)
1099 @command('perfdiffwd', formatteropts)
1035 def perfdiffwd(ui, repo, **opts):
1100 def perfdiffwd(ui, repo, **opts):
1036 """Profile diff of working directory changes"""
1101 """Profile diff of working directory changes"""
@@ -114,6 +114,7 b' perfstatus'
114 perftags (no help text available)
114 perftags (no help text available)
115 perftemplating
115 perftemplating
116 (no help text available)
116 (no help text available)
117 perfunidiff benchmark a unified diff between revisions
117 perfvolatilesets
118 perfvolatilesets
118 benchmark the computation of various volatile set
119 benchmark the computation of various volatile set
119 perfwalk (no help text available)
120 perfwalk (no help text available)
@@ -126,6 +127,8 b' perfstatus'
126 $ hg perfannotate a
127 $ hg perfannotate a
127 $ hg perfbdiff -c 1
128 $ hg perfbdiff -c 1
128 $ hg perfbdiff --alldata 1
129 $ hg perfbdiff --alldata 1
130 $ hg perfunidiff -c 1
131 $ hg perfunidiff --alldata 1
129 $ hg perfbookmarks
132 $ hg perfbookmarks
130 $ hg perfbranchmap
133 $ hg perfbranchmap
131 $ hg perfcca
134 $ hg perfcca
General Comments 0
You need to be logged in to leave comments. Login now