~bzr/bzr/bzr.1.5

« back to all changes in this revision

Viewing changes to bzrlib/benchmarks/bench_bundle.py

  • Committer: John Arbash Meinel
  • Date: 2006-10-11 00:23:23 UTC
  • mfrom: (2070 +trunk)
  • mto: This revision was merged to the branch mainline in revision 2071.
  • Revision ID: john@arbash-meinel.com-20061011002323-82ba88c293d7caff
[merge] bzr.dev 2070

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_committed_tree('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_100_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], 100, 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_100_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], 100, 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_100_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], 100, 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_100_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], 100, 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_100_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], 100, 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_100_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], 100, 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
class BundleLibraryLevelInstallBenchmark(Benchmark):
 
199
    """ Benchmarks for the install_bundle library function. """
 
200
 
 
201
    def _time_read_write(self):
 
202
        branch, relpath = Branch.open_containing("a")
 
203
        revision_history = branch.revision_history()
 
204
        bundle_text = StringIO()
 
205
        write_bundle(branch.repository, revision_history[-1],
 
206
                     NULL_REVISION, bundle_text)
 
207
        bundle_text.seek(0)
 
208
        target_tree = self.make_branch_and_tree('b')
 
209
        bundle = self.time(read_bundle, bundle_text)
 
210
        self.time(install_bundle, target_tree.branch.repository, bundle)
 
211
 
 
212
    def test_few_files_small_tree_1_revision(self):
 
213
        os.mkdir("a")
 
214
        tree, files = self.create_with_commits(5, 1, directory_name="a")
 
215
        self.commit_some_revisions(tree, files[:5], 1, 1)
 
216
        self._time_read_write()
 
217
 
 
218
    def test_few_files_small_tree_100_revision(self):
 
219
        os.mkdir("a")
 
220
        tree, files = self.create_with_commits(5, 1, directory_name="a")
 
221
        self.commit_some_revisions(tree, files[:5], 100, 1)
 
222
        self._time_read_write()
 
223
 
 
224
    def test_few_files_moderate_tree_1_revision(self):
 
225
        os.mkdir("a")
 
226
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
227
        self.commit_some_revisions(tree, files[:5], 1, 1)
 
228
        self._time_read_write()
 
229
 
 
230
    def test_few_files_moderate_tree_100_revision(self):
 
231
        os.mkdir("a")
 
232
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
233
        self.commit_some_revisions(tree, files[:5], 100, 1)
 
234
        self._time_read_write()
 
235
 
 
236
    def test_some_files_moderate_tree_1_revision(self):
 
237
        os.mkdir("a")
 
238
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
239
        self.commit_some_revisions(tree, files[:100], 1, 1)
 
240
        self._time_read_write()
 
241
 
 
242
    def test_some_files_moderate_tree_100_revision(self):
 
243
        os.mkdir("a")
 
244
        tree, files = self.create_with_commits(100, 1, directory_name="a")
 
245
        self.commit_some_revisions(tree, files[:100], 100, 1)
 
246
        self._time_read_write()
 
247
 
 
248
    def test_few_files_big_tree_1_revision(self):
 
249
        os.mkdir("a")
 
250
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
251
        self.commit_some_revisions(tree, files[:5], 1, 1)
 
252
        self._time_read_write()
 
253
 
 
254
    def test_few_files_big_tree_100_revision(self):
 
255
        os.mkdir("a")
 
256
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
257
        self.commit_some_revisions(tree, files[:5], 100, 1)
 
258
        self._time_read_write()
 
259
 
 
260
    def test_some_files_big_tree_1_revision(self):
 
261
        os.mkdir("a")
 
262
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
263
        self.commit_some_revisions(tree, files[:100], 1, 1)
 
264
        self._time_read_write()
 
265
 
 
266
    def test_some_files_big_tree_100_revision(self):
 
267
        os.mkdir("a")
 
268
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
269
        self.commit_some_revisions(tree, files[:100], 100, 1)
 
270
        self._time_read_write()
 
271
 
 
272
    def test_many_files_big_tree_1_revision(self):
 
273
        os.mkdir("a")
 
274
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
275
        self.commit_some_revisions(tree, files[:1000], 1, 1)
 
276
        self._time_read_write()
 
277
 
 
278
    def test_many_files_big_tree_100_revision(self):
 
279
        os.mkdir("a")
 
280
        tree, files = self.create_with_commits(1000, 1, directory_name="a")
 
281
        self.commit_some_revisions(tree, files[:1000], 100, 1)
 
282
        self._time_read_write()
 
283
 
 
284
 
 
285
if __name__ == '__main__':
 
286
    # USE the following if you want to regenerate the above test functions 
 
287
    for treesize, treesize_h in [(5, "small"), (100, "moderate"),
 
288
                                 (1000, "big")]:
 
289
        for bundlefiles, bundlefiles_h in [(5, "few"), (100, "some"),
 
290
                                           (1000, "many")]:
 
291
            if bundlefiles > treesize:
 
292
                continue
 
293
            for num_revisions in [1, 100, 1000]:
 
294
                code = """\
 
295
    def test_%s_files_%s_tree_%s_revision(self):
 
296
        os.mkdir("a")
 
297
        tree, files = self.create_with_commits(%s, 1, directory_name="a")
 
298
        self.commit_some_revisions(tree, files[:%s], %s, 1)
 
299
        self._time_read_write()
 
300
""" % (bundlefiles_h, treesize_h, num_revisions,
 
301
       treesize, bundlefiles, num_revisions)
 
302
                print code
 
303
 
 
304
 
 
305