17
from breezy.ui import text
19
p = optparse.OptionParser()
20
p.add_option('--quick', default=False, action='store_true')
21
p.add_option('--max-combinations', default=500, type=int)
22
p.add_option('--lsprof', default=None, type=str)
23
opts, args = p.parse_args(sys.argv[1:])
25
trace.enable_default_logging()
26
ui.ui_factory = text.TextUIFactory()
28
begin = osutils.perf_counter()
30
b = branch.Branch.open(args[0])
32
b = branch.Branch.open('.')
34
g = b.repository.get_graph()
35
parent_map = dict(p for p in g.iter_ancestry([b.last_revision()])
37
end = osutils.perf_counter()
39
print('Found %d nodes, loaded in %.3fs' % (len(parent_map), end - begin))
41
def all_heads_comp(g, combinations):
43
with ui.ui_factory.nested_progress_bar() as pb:
44
for idx, combo in enumerate(combinations):
46
pb.update('proc', idx, len(combinations))
47
h.append(g.heads(combo))
51
# parents = parent_map.keys()
53
# for p2 in random.sample(parents, 10):
54
# combinations.append((p1, p2))
55
# Times for random sampling of 10x1150 of bzrtools
58
# Times for 500 'merge parents' from bzr.dev
61
for revision_id, parent_ids in parent_map.iteritems():
62
if parent_ids is not None and len(parent_ids) > 1:
63
combinations.append(parent_ids)
64
# The largest portion of the graph that has to be walked for a heads() check
65
# combinations = [('john@arbash-meinel.com-20090312021943-tu6tcog48aiujx4s',
66
# 'john@arbash-meinel.com-20090312130552-09xa2xsitf6rilzc')]
67
if opts.max_combinations > 0 and len(combinations) > opts.max_combinations:
68
combinations = random.sample(combinations, opts.max_combinations)
70
print(' %d combinations' % (len(combinations),))
72
def combi_graph(graph_klass, comb):
74
graph._counters[1] = 0
75
graph._counters[2] = 0
77
begin = osutils.perf_counter()
78
g = graph_klass(parent_map)
79
if opts.lsprof is not None:
80
heads = commands.apply_lsprofiled(opts.lsprof, all_heads_comp, g, comb)
82
heads = all_heads_comp(g, comb)
83
end = osutils.perf_counter()
84
return dict(elapsed=(end - begin), graph=g, heads=heads)
87
print('%s: %.3fs' % (name, g['elapsed']))
89
for c in graph._counters:
93
print(' %s' % (graph._counters,))
95
known_python = combi_graph(_known_graph_py.KnownGraph, combinations)
96
report('Known', known_python)
98
known_pyrex = combi_graph(_known_graph_pyx.KnownGraph, combinations)
99
report('Known (pyx)', known_pyrex)
101
def _simple_graph(parent_map):
102
return graph.Graph(graph.DictParentsProvider(parent_map))
105
if known_python['heads'] != known_pyrex['heads']:
106
import pdb; pdb.set_trace()
107
print('ratio: %.1f:1 faster' % (
108
known_python['elapsed'] / known_pyrex['elapsed'],))
110
orig = combi_graph(_simple_graph, combinations)
113
if orig['heads'] != known_pyrex['heads']:
114
import pdb; pdb.set_trace()
116
print('ratio: %.1f:1 faster' % (
117
orig['elapsed'] / known_pyrex['elapsed'],))