##// 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 1031 with ready:
1032 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 1099 @command('perfdiffwd', formatteropts)
1035 1100 def perfdiffwd(ui, repo, **opts):
1036 1101 """Profile diff of working directory changes"""
@@ -114,6 +114,7 b' perfstatus'
114 114 perftags (no help text available)
115 115 perftemplating
116 116 (no help text available)
117 perfunidiff benchmark a unified diff between revisions
117 118 perfvolatilesets
118 119 benchmark the computation of various volatile set
119 120 perfwalk (no help text available)
@@ -126,6 +127,8 b' perfstatus'
126 127 $ hg perfannotate a
127 128 $ hg perfbdiff -c 1
128 129 $ hg perfbdiff --alldata 1
130 $ hg perfunidiff -c 1
131 $ hg perfunidiff --alldata 1
129 132 $ hg perfbookmarks
130 133 $ hg perfbranchmap
131 134 $ hg perfcca
General Comments 0
You need to be logged in to leave comments. Login now