/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: Vincent Ladeuil
  • Date: 2010-01-25 15:55:48 UTC
  • mto: (4985.1.4 add-attr-cleanup)
  • mto: This revision was merged to the branch mainline in revision 4988.
  • Revision ID: v.ladeuil+lp@free.fr-20100125155548-0l352pujvt5bzl5e
Deploy addAttrCleanup on the whole test suite.

Several use case worth mentioning:

- setting a module or any other object attribute is the majority
by far. In some cases the setting itself is deferred but most of
the time we want to set at the same time we add the cleanup.

- there multiple occurrences of protecting hooks or ui factory
which are now useless (the test framework takes care of that now),

- there was some lambda uses that can now be avoided.

That first cleanup already simplifies things a lot.

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'],)