1
# Copyright (C) 2006 Canonical Ltd
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11
# GNU General Public License for more details.
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17
"""Tests for bzr bundle performance."""
19
from cStringIO import StringIO
23
from bzrlib import bzrdir
24
from bzrlib.add import smart_add
25
from bzrlib.benchmarks import Benchmark
26
from bzrlib.branch import Branch
27
from bzrlib.bundle import read_bundle
28
from bzrlib.bundle.apply_bundle import install_bundle
29
from bzrlib.bundle.serializer import write_bundle
30
from bzrlib.revision import NULL_REVISION
31
from bzrlib.revisionspec import RevisionSpec
32
from bzrlib.workingtree import WorkingTree
35
class BundleBenchmark(Benchmark):
36
"""Benchmarks for bzr bundle performance and bzr merge with a bundle."""
38
def test_create_bundle_known_kernel_like_tree(self):
39
"""Create a bundle for a kernel sized tree with no ignored, unknowns,
40
or added and one commit.
42
self.make_kernel_like_committed_tree()
43
self.time(self.run_bzr, 'bundle', '--revision', '..-1')
45
def test_create_bundle_many_commit_tree (self):
46
"""Create a bundle for a tree with many commits but no changes."""
47
self.make_many_commit_tree()
48
self.time(self.run_bzr, 'bundle', '--revision', '..-1')
50
def test_create_bundle_heavily_merged_tree(self):
51
"""Create a bundle for a heavily merged tree."""
52
self.make_heavily_merged_tree()
53
self.time(self.run_bzr, 'bundle', '--revision', '..-1')
55
def test_apply_bundle_known_kernel_like_tree(self):
56
"""Create a bundle for a kernel sized tree with no ignored, unknowns,
57
or added and one commit.
59
tree = self.make_kernel_like_committed_tree('tree')
61
f = open('bundle', 'wb')
63
write_bundle(tree.branch.repository, tree.last_revision(),
68
tree2 = self.make_branch_and_tree('branch_a')
70
self.time(self.run_bzr, 'merge', '../bundle')
72
class BundleLibraryLevelWriteBenchmark(Benchmark):
73
""" Benchmarks for the write_bundle library function. """
75
def _time_read_write(self):
77
branch, relpath = Branch.open_containing("a")
78
revision_history = branch.revision_history()
79
bundle_text = StringIO()
80
print "starting write bundle"
81
self.time(write_bundle, branch.repository, revision_history[-1],
82
NULL_REVISION, bundle_text)
83
print "stopped writing bundle"
85
target_tree = self.make_branch_and_tree('b')
86
print "starting reading bundle"
87
bundle = self.time(read_bundle, bundle_text)
88
print "starting installing bundle"
89
self.time(install_bundle, target_tree.branch.repository, bundle)
91
def test_few_files_small_tree_1_revision(self):
93
tree, files = self.create_with_commits(5, 1, directory_name="a")
94
self.commit_some_revisions(tree, files[:5], 1, 1)
95
self._time_read_write()
97
def test_few_files_small_tree_100_revision(self):
99
tree, files = self.create_with_commits(5, 1, directory_name="a")
100
self.commit_some_revisions(tree, files[:5], 100, 1)
101
self._time_read_write()
103
def test_few_files_small_tree_1000_revision(self):
105
tree, files = self.create_with_commits(5, 1, directory_name="a")
106
self.commit_some_revisions(tree, files[:5], 1000, 1)
107
self._time_read_write()
109
def test_few_files_moderate_tree_1_revision(self):
111
tree, files = self.create_with_commits(100, 1, directory_name="a")
112
self.commit_some_revisions(tree, files[:5], 1, 1)
113
self._time_read_write()
115
def test_few_files_moderate_tree_100_revision(self):
117
tree, files = self.create_with_commits(100, 1, directory_name="a")
118
self.commit_some_revisions(tree, files[:5], 100, 1)
119
self._time_read_write()
121
def test_few_files_moderate_tree_1000_revision(self):
123
tree, files = self.create_with_commits(100, 1, directory_name="a")
124
self.commit_some_revisions(tree, files[:5], 1000, 1)
125
self._time_read_write()
127
def test_some_files_moderate_tree_1_revision(self):
129
tree, files = self.create_with_commits(100, 1, directory_name="a")
130
self.commit_some_revisions(tree, files[:100], 1, 1)
131
self._time_read_write()
133
def test_some_files_moderate_tree_100_revision(self):
135
tree, files = self.create_with_commits(100, 1, directory_name="a")
136
self.commit_some_revisions(tree, files[:100], 100, 1)
137
self._time_read_write()
139
def test_some_files_moderate_tree_1000_revision(self):
141
tree, files = self.create_with_commits(100, 1, directory_name="a")
142
self.commit_some_revisions(tree, files[:100], 1000, 1)
143
self._time_read_write()
145
def test_few_files_big_tree_1_revision(self):
147
tree, files = self.create_with_commits(1000, 1, directory_name="a")
148
self.commit_some_revisions(tree, files[:5], 1, 1)
149
self._time_read_write()
151
def test_few_files_big_tree_100_revision(self):
153
tree, files = self.create_with_commits(1000, 1, directory_name="a")
154
self.commit_some_revisions(tree, files[:5], 100, 1)
155
self._time_read_write()
157
def test_few_files_big_tree_1000_revision(self):
159
tree, files = self.create_with_commits(1000, 1, directory_name="a")
160
self.commit_some_revisions(tree, files[:5], 1000, 1)
161
self._time_read_write()
163
def test_some_files_big_tree_1_revision(self):
165
tree, files = self.create_with_commits(1000, 1, directory_name="a")
166
self.commit_some_revisions(tree, files[:100], 1, 1)
167
self._time_read_write()
169
def test_some_files_big_tree_100_revision(self):
171
tree, files = self.create_with_commits(1000, 1, directory_name="a")
172
self.commit_some_revisions(tree, files[:100], 100, 1)
173
self._time_read_write()
175
def test_some_files_big_tree_1000_revision(self):
177
tree, files = self.create_with_commits(1000, 1, directory_name="a")
178
self.commit_some_revisions(tree, files[:100], 1000, 1)
179
self._time_read_write()
181
def test_many_files_big_tree_1_revision(self):
183
tree, files = self.create_with_commits(1000, 1, directory_name="a")
184
self.commit_some_revisions(tree, files[:1000], 1, 1)
185
self._time_read_write()
187
def test_many_files_big_tree_100_revision(self):
189
tree, files = self.create_with_commits(1000, 1, directory_name="a")
190
self.commit_some_revisions(tree, files[:1000], 100, 1)
191
self._time_read_write()
193
def test_many_files_big_tree_1000_revision(self):
195
tree, files = self.create_with_commits(1000, 1, directory_name="a")
196
self.commit_some_revisions(tree, files[:1000], 1000, 1)
197
self._time_read_write()
199
class BundleLibraryLevelInstallBenchmark(Benchmark):
200
""" Benchmarks for the install_bundle library function. """
202
def _time_read_write(self):
203
branch, relpath = Branch.open_containing("a")
204
revision_history = branch.revision_history()
205
bundle_text = StringIO()
206
write_bundle(branch.repository, revision_history[-1],
207
NULL_REVISION, bundle_text)
209
target_tree = self.make_branch_and_tree('b')
210
bundle = self.time(read_bundle, bundle_text)
211
self.time(install_bundle, target_tree.branch.repository, bundle)
213
def test_few_files_small_tree_1_revision(self):
215
tree, files = self.create_with_commits(5, 1, directory_name="a")
216
self.commit_some_revisions(tree, files[:5], 1, 1)
217
self._time_read_write()
219
def test_few_files_small_tree_100_revision(self):
221
tree, files = self.create_with_commits(5, 1, directory_name="a")
222
self.commit_some_revisions(tree, files[:5], 100, 1)
223
self._time_read_write()
225
def test_few_files_moderate_tree_1_revision(self):
227
tree, files = self.create_with_commits(100, 1, directory_name="a")
228
self.commit_some_revisions(tree, files[:5], 1, 1)
229
self._time_read_write()
231
def test_few_files_moderate_tree_100_revision(self):
233
tree, files = self.create_with_commits(100, 1, directory_name="a")
234
self.commit_some_revisions(tree, files[:5], 100, 1)
235
self._time_read_write()
237
def test_some_files_moderate_tree_1_revision(self):
239
tree, files = self.create_with_commits(100, 1, directory_name="a")
240
self.commit_some_revisions(tree, files[:100], 1, 1)
241
self._time_read_write()
243
def test_some_files_moderate_tree_100_revision(self):
245
tree, files = self.create_with_commits(100, 1, directory_name="a")
246
self.commit_some_revisions(tree, files[:100], 100, 1)
247
self._time_read_write()
249
def test_few_files_big_tree_1_revision(self):
251
tree, files = self.create_with_commits(1000, 1, directory_name="a")
252
self.commit_some_revisions(tree, files[:5], 1, 1)
253
self._time_read_write()
255
def test_few_files_big_tree_100_revision(self):
257
tree, files = self.create_with_commits(1000, 1, directory_name="a")
258
self.commit_some_revisions(tree, files[:5], 100, 1)
259
self._time_read_write()
261
def test_some_files_big_tree_1_revision(self):
263
tree, files = self.create_with_commits(1000, 1, directory_name="a")
264
self.commit_some_revisions(tree, files[:100], 1, 1)
265
self._time_read_write()
267
def test_some_files_big_tree_100_revision(self):
269
tree, files = self.create_with_commits(1000, 1, directory_name="a")
270
self.commit_some_revisions(tree, files[:100], 100, 1)
271
self._time_read_write()
273
def test_many_files_big_tree_1_revision(self):
275
tree, files = self.create_with_commits(1000, 1, directory_name="a")
276
self.commit_some_revisions(tree, files[:1000], 1, 1)
277
self._time_read_write()
279
def test_many_files_big_tree_100_revision(self):
281
tree, files = self.create_with_commits(1000, 1, directory_name="a")
282
self.commit_some_revisions(tree, files[:1000], 100, 1)
283
self._time_read_write()
286
if __name__ == '__main__':
287
# USE the following if you want to regenerate the above test functions
288
for treesize, treesize_h in [(5, "small"), (100, "moderate"),
290
for bundlefiles, bundlefiles_h in [(5, "few"), (100, "some"),
292
if bundlefiles > treesize:
294
for num_revisions in [1, 100, 1000]:
296
def test_%s_files_%s_tree_%s_revision(self):
298
tree, files = self.create_with_commits(%s, 1, directory_name="a")
299
self.commit_some_revisions(tree, files[:%s], %s, 1)
300
self._time_read_write()
301
""" % (bundlefiles_h, treesize_h, num_revisions,
302
treesize, bundlefiles, num_revisions)