/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to tools/time_graph.py

  • Committer: John Arbash Meinel
  • Date: 2010-01-12 22:51:31 UTC
  • mto: This revision was merged to the branch mainline in revision 4955.
  • Revision ID: john@arbash-meinel.com-20100112225131-he8h411p6aeeb947
Delay grabbing an output stream until we actually go to show a diff.

This makes the test suite happy, but it also seems to be reasonable.
If we aren't going to write anything, we don't need to hold an
output stream open.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
import random
 
3
import os
 
4
import time
 
5
import sys
 
6
import optparse
 
7
from bzrlib import (
 
8
    branch,
 
9
    commands,
 
10
    graph,
 
11
    ui,
 
12
    trace,
 
13
    _known_graph_py,
 
14
    _known_graph_pyx,
 
15
    )
 
16
from bzrlib.ui import text
 
17
 
 
18
p = optparse.OptionParser()
 
19
p.add_option('--quick', default=False, action='store_true')
 
20
p.add_option('--max-combinations', default=500, type=int)
 
21
p.add_option('--lsprof', default=None, type=str)
 
22
opts, args = p.parse_args(sys.argv[1:])
 
23
 
 
24
trace.enable_default_logging()
 
25
ui.ui_factory = text.TextUIFactory()
 
26
 
 
27
begin = time.clock()
 
28
if len(args) >= 1:
 
29
    b = branch.Branch.open(args[0])
 
30
else:
 
31
    b = branch.Branch.open('.')
 
32
b.lock_read()
 
33
try:
 
34
    g = b.repository.get_graph()
 
35
    parent_map = dict(p for p in g.iter_ancestry([b.last_revision()])
 
36
                         if p[1] is not None)
 
37
finally:
 
38
    b.unlock()
 
39
end = time.clock()
 
40
 
 
41
print 'Found %d nodes, loaded in %.3fs' % (len(parent_map), end - begin)
 
42
 
 
43
def all_heads_comp(g, combinations):
 
44
    h = []
 
45
    pb = ui.ui_factory.nested_progress_bar()
 
46
    try:
 
47
        for idx, combo in enumerate(combinations):
 
48
            if idx & 0x1f == 0:
 
49
                pb.update('proc', idx, len(combinations))
 
50
            h.append(g.heads(combo))
 
51
    finally:
 
52
        pb.finished()
 
53
    return h
 
54
 
 
55
combinations = []
 
56
# parents = parent_map.keys()
 
57
# for p1 in parents:
 
58
#     for p2 in random.sample(parents, 10):
 
59
#         combinations.append((p1, p2))
 
60
# Times for random sampling of 10x1150 of bzrtools
 
61
#   Graph        KnownGraph
 
62
#   96.1s   vs   25.7s  :)
 
63
# Times for 500 'merge parents' from bzr.dev
 
64
#   25.6s   vs   45.0s  :(
 
65
 
 
66
for revision_id, parent_ids in parent_map.iteritems():
 
67
    if parent_ids is not None and len(parent_ids) > 1:
 
68
        combinations.append(parent_ids)
 
69
# The largest portion of the graph that has to be walked for a heads() check
 
70
# combinations = [('john@arbash-meinel.com-20090312021943-tu6tcog48aiujx4s',
 
71
#                  'john@arbash-meinel.com-20090312130552-09xa2xsitf6rilzc')]
 
72
if opts.max_combinations > 0 and len(combinations) > opts.max_combinations:
 
73
    combinations = random.sample(combinations, opts.max_combinations)
 
74
 
 
75
print '      %d combinations' % (len(combinations),)
 
76
 
 
77
def combi_graph(graph_klass, comb):
 
78
    # DEBUG
 
79
    graph._counters[1] = 0
 
80
    graph._counters[2] = 0
 
81
 
 
82
    begin = time.clock()
 
83
    g = graph_klass(parent_map)
 
84
    if opts.lsprof is not None:
 
85
        heads = commands.apply_lsprofiled(opts.lsprof, all_heads_comp, g, comb)
 
86
    else:
 
87
        heads = all_heads_comp(g, comb)
 
88
    end = time.clock()
 
89
    return dict(elapsed=(end - begin), graph=g, heads=heads)
 
90
 
 
91
def report(name, g):
 
92
    print '%s: %.3fs' % (name, g['elapsed'])
 
93
    counters_used = False
 
94
    for c in graph._counters:
 
95
        if c:
 
96
            counters_used = True
 
97
    if counters_used:
 
98
        print '  %s' % (graph._counters,)
 
99
 
 
100
known_python = combi_graph(_known_graph_py.KnownGraph, combinations)
 
101
report('Known', known_python)
 
102
 
 
103
known_pyrex = combi_graph(_known_graph_pyx.KnownGraph, combinations)
 
104
report('Known (pyx)', known_pyrex)
 
105
 
 
106
def _simple_graph(parent_map):
 
107
    return graph.Graph(graph.DictParentsProvider(parent_map))
 
108
 
 
109
if opts.quick:
 
110
    if known_python['heads'] != known_pyrex['heads']:
 
111
        import pdb; pdb.set_trace()
 
112
    print 'ratio: %.1f:1 faster' % (
 
113
        known_python['elapsed'] / known_pyrex['elapsed'],)
 
114
else:
 
115
    orig = combi_graph(_simple_graph, combinations)
 
116
    report('Orig', orig)
 
117
 
 
118
    if orig['heads'] != known_pyrex['heads']:
 
119
        import pdb; pdb.set_trace()
 
120
 
 
121
    print 'ratio: %.1f:1 faster' % (
 
122
        orig['elapsed'] / known_pyrex['elapsed'],)