/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 bzrlib/benchmarks/bench_bundle.py

Merge bzr.dev.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright (C) 2006 by Canonical Ltd
 
2
#
 
3
# This program is free software; you can redistribute it and/or modify
 
4
# it under the terms of the GNU General Public License version 2 as published by
 
5
# the Free Software Foundation.
 
6
#
 
7
# This program is distributed in the hope that it will be useful,
 
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
 
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
10
# GNU General Public License for more details.
 
11
#
 
12
# You should have received a copy of the GNU General Public License
 
13
# along with this program; if not, write to the Free Software
 
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
 
 
16
"""Tests for bzr bundle performance."""
 
17
 
 
18
from cStringIO import StringIO
 
19
import os
 
20
import shutil
 
21
 
 
22
from bzrlib import bzrdir
 
23
from bzrlib.add import smart_add
 
24
from bzrlib.benchmarks import Benchmark
 
25
from bzrlib.branch import Branch
 
26
from bzrlib.bundle import read_bundle
 
27
from bzrlib.bundle.apply_bundle import install_bundle
 
28
from bzrlib.bundle.serializer import write_bundle
 
29
from bzrlib.revision import NULL_REVISION
 
30
from bzrlib.revisionspec import RevisionSpec
 
31
from bzrlib.workingtree import WorkingTree
 
32
 
 
33
 
 
34
class BundleBenchmark(Benchmark):
 
35
    """Benchmarks for bzr bundle performance and bzr merge with a bundle."""
 
36
   
 
37
    def test_create_bundle_known_kernel_like_tree(self):
 
38
        """Create a bundle for a kernel sized tree with no ignored, unknowns,
 
39
        or added and one commit.
 
40
        """ 
 
41
        self.make_kernel_like_committed_tree()
 
42
        self.time(self.run_bzr, 'bundle', '--revision', '..-1')
 
43
 
 
44
    def test_create_bundle_many_commit_tree (self):
 
45
        """Create a bundle for a tree with many commits but no changes.""" 
 
46
        self.make_many_commit_tree()
 
47
        self.time(self.run_bzr, 'bundle', '--revision', '..-1')
 
48
 
 
49
    def test_create_bundle_heavily_merged_tree(self):
 
50
        """Create a bundle for a heavily merged tree.""" 
 
51
        self.make_heavily_merged_tree()
 
52
        self.time(self.run_bzr, 'bundle', '--revision', '..-1')
 
53
        
 
54
    def test_apply_bundle_known_kernel_like_tree(self):
 
55
        """Create a bundle for a kernel sized tree with no ignored, unknowns,
 
56
        or added and one commit.
 
57
        """ 
 
58
        tree = self.make_kernel_like_tree_committed('tree')
 
59
 
 
60
        f = open('bundle', 'wb')
 
61
        try:
 
62
            write_bundle(tree.branch.repository, tree.last_revision(),
 
63
                         NULL_REVISION, f)
 
64
        finally:
 
65
            f.close()
 
66
 
 
67
        tree2 = self.make_branch_and_tree('branch_a')
 
68
        os.chdir('branch_a')
 
69
        self.time(self.run_bzr, 'merge', '../bundle')
 
70
 
 
71
class BundleLibraryLevelWriteBenchmark(Benchmark):
 
72
    """ Benchmarks for the write_bundle library function. """
 
73
 
 
74
    def _time_read_write(self):
 
75
        print "timing"
 
76
        branch, relpath = Branch.open_containing("a")
 
77
        revision_history = branch.revision_history()
 
78
        bundle_text = StringIO()
 
79
        print "starting write bundle"
 
80
        self.time(write_bundle, branch.repository, revision_history[-1],
 
81
                  NULL_REVISION, bundle_text)
 
82
        print "stopped writing bundle"
 
83
        bundle_text.seek(0)
 
84
        target_tree = self.make_branch_and_tree('b')
 
85
        print "starting reading bundle"
 
86
        bundle = self.time(read_bundle, bundle_text)
 
87
        print "starting installing bundle"
 
88
        self.time(install_bundle, target_tree.branch.repository, bundle)
 
89
 
 
90
    def test_few_files_small_tree_1_revision(self):
 
91
        os.mkdir("a")
 
92
        tree, files = self.create_with_commits(5, 1, directory_name="a")
 
93
        self.commit_some_revisions(tree, files[:5], 1, 1)
 
94
        self._time_read_write()
 
95
 
 
96
    def test_few_files_small_tree_500_revision(self):
 
97
        os.mkdir("a")
 
98
        tree, files = self.create_with_commits(5, 1, directory_name="a")
 
99
        self.commit_some_revisions(tree, files[:5], 500, 1)
 
100
        self._time_read_write()
 
101
 
 
102
    def test_few_files_small_tree_1000_revision(self):
 
103
        os.mkdir("a")
 
104
        tree, files = self.create_with_commits(5, 1, directory_name="a")
 
105
        self.commit_some_revisions(tree, files[:5], 1000, 1)
 
106
        self._time_read_write()
 
107
 
 
108
    def test_few_files_moderate_tree_1_revision(self):
 
109
        os.mkdir("a")
 
110
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
111
        self.commit_some_revisions(tree, files[:5], 1, 1)
 
112
        self._time_read_write()
 
113
 
 
114
    def test_few_files_moderate_tree_500_revision(self):
 
115
        os.mkdir("a")
 
116
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
117
        self.commit_some_revisions(tree, files[:5], 500, 1)
 
118
        self._time_read_write()
 
119
 
 
120
    def test_few_files_moderate_tree_1000_revision(self):
 
121
        os.mkdir("a")
 
122
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
123
        self.commit_some_revisions(tree, files[:5], 1000, 1)
 
124
        self._time_read_write()
 
125
 
 
126
    def test_some_files_moderate_tree_1_revision(self):
 
127
        os.mkdir("a")
 
128
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
129
        self.commit_some_revisions(tree, files[:100], 1, 1)
 
130
        self._time_read_write()
 
131
 
 
132
    def test_some_files_moderate_tree_500_revision(self):
 
133
        os.mkdir("a")
 
134
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
135
        self.commit_some_revisions(tree, files[:100], 500, 1)
 
136
        self._time_read_write()
 
137
 
 
138
    def test_some_files_moderate_tree_1000_revision(self):
 
139
        os.mkdir("a")
 
140
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
141
        self.commit_some_revisions(tree, files[:100], 1000, 1)
 
142
        self._time_read_write()
 
143
 
 
144
    def test_few_files_big_tree_1_revision(self):
 
145
        os.mkdir("a")
 
146
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
147
        self.commit_some_revisions(tree, files[:5], 1, 1)
 
148
        self._time_read_write()
 
149
 
 
150
    def test_few_files_big_tree_500_revision(self):
 
151
        os.mkdir("a")
 
152
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
153
        self.commit_some_revisions(tree, files[:5], 500, 1)
 
154
        self._time_read_write()
 
155
 
 
156
    def test_few_files_big_tree_1000_revision(self):
 
157
        os.mkdir("a")
 
158
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
159
        self.commit_some_revisions(tree, files[:5], 1000, 1)
 
160
        self._time_read_write()
 
161
 
 
162
    def test_some_files_big_tree_1_revision(self):
 
163
        os.mkdir("a")
 
164
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
165
        self.commit_some_revisions(tree, files[:100], 1, 1)
 
166
        self._time_read_write()
 
167
 
 
168
    def test_some_files_big_tree_500_revision(self):
 
169
        os.mkdir("a")
 
170
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
171
        self.commit_some_revisions(tree, files[:100], 500, 1)
 
172
        self._time_read_write()
 
173
 
 
174
    def test_some_files_big_tree_1000_revision(self):
 
175
        os.mkdir("a")
 
176
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
177
        self.commit_some_revisions(tree, files[:100], 1000, 1)
 
178
        self._time_read_write()
 
179
 
 
180
    def test_many_files_big_tree_1_revision(self):
 
181
        os.mkdir("a")
 
182
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
183
        self.commit_some_revisions(tree, files[:1000], 1, 1)
 
184
        self._time_read_write()
 
185
 
 
186
    def test_many_files_big_tree_500_revision(self):
 
187
        os.mkdir("a")
 
188
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
189
        self.commit_some_revisions(tree, files[:1000], 500, 1)
 
190
        self._time_read_write()
 
191
 
 
192
    def test_many_files_big_tree_1000_revision(self):
 
193
        os.mkdir("a")
 
194
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
195
        self.commit_some_revisions(tree, files[:1000], 1000, 1)
 
196
        self._time_read_write()
 
197
 
 
198
 
 
199
if __name__ == '__main__':
 
200
    # USE the following if you want to regenerate the above test functions 
 
201
    for treesize, treesize_h in [(5, "small"), (100, "moderate"),
 
202
                                 (1000, "big")]:
 
203
        for bundlefiles, bundlefiles_h in [(5, "few"), (100, "some"),
 
204
                                           (1000, "many")]:
 
205
            if bundlefiles > treesize:
 
206
                continue
 
207
            for num_revisions in [1, 500, 1000]:
 
208
                code = """\
 
209
    def test_%s_files_%s_tree_%s_revision(self):
 
210
        os.mkdir("a")
 
211
        tree, files = self.create_with_commits(%s, 1, directory_name="a")
 
212
        self.commit_some_revisions(tree, files[:%s], %s, 1)
 
213
        self._time_read_write()
 
214
""" % (bundlefiles_h, treesize_h, num_revisions,
 
215
       treesize, bundlefiles, num_revisions)
 
216
                print code
 
217
 
 
218