1
# Copyright (C) 2006 by 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 version 2 as published by
5
# the Free Software Foundation.
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.
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
16
"""Tests for bzr bundle performance."""
18
from cStringIO import StringIO
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
34
class BundleBenchmark(Benchmark):
35
"""Benchmarks for bzr bundle performance and bzr merge with a bundle."""
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.
41
self.make_kernel_like_committed_tree()
42
self.time(self.run_bzr, 'bundle', '--revision', '..-1')
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')
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')
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.
58
tree = self.make_kernel_like_committed_tree('tree')
60
f = open('bundle', 'wb')
62
write_bundle(tree.branch.repository, tree.last_revision(),
67
tree2 = self.make_branch_and_tree('branch_a')
69
self.time(self.run_bzr, 'merge', '../bundle')
71
class BundleLibraryLevelWriteBenchmark(Benchmark):
72
""" Benchmarks for the write_bundle library function. """
74
def _time_read_write(self):
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"
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)
90
def test_few_files_small_tree_1_revision(self):
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()
96
def test_few_files_small_tree_100_revision(self):
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()
102
def test_few_files_small_tree_1000_revision(self):
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()
108
def test_few_files_moderate_tree_1_revision(self):
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()
114
def test_few_files_moderate_tree_100_revision(self):
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()
120
def test_few_files_moderate_tree_1000_revision(self):
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()
126
def test_some_files_moderate_tree_1_revision(self):
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()
132
def test_some_files_moderate_tree_100_revision(self):
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()
138
def test_some_files_moderate_tree_1000_revision(self):
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()
144
def test_few_files_big_tree_1_revision(self):
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()
150
def test_few_files_big_tree_100_revision(self):
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()
156
def test_few_files_big_tree_1000_revision(self):
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()
162
def test_some_files_big_tree_1_revision(self):
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()
168
def test_some_files_big_tree_100_revision(self):
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()
174
def test_some_files_big_tree_1000_revision(self):
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()
180
def test_many_files_big_tree_1_revision(self):
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()
186
def test_many_files_big_tree_100_revision(self):
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()
192
def test_many_files_big_tree_1000_revision(self):
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()
198
class BundleLibraryLevelInstallBenchmark(Benchmark):
199
""" Benchmarks for the install_bundle library function. """
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)
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)
212
def test_few_files_small_tree_1_revision(self):
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()
218
def test_few_files_small_tree_100_revision(self):
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()
224
def test_few_files_moderate_tree_1_revision(self):
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()
230
def test_few_files_moderate_tree_100_revision(self):
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()
236
def test_some_files_moderate_tree_1_revision(self):
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()
242
def test_some_files_moderate_tree_100_revision(self):
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()
248
def test_few_files_big_tree_1_revision(self):
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()
254
def test_few_files_big_tree_100_revision(self):
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()
260
def test_some_files_big_tree_1_revision(self):
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()
266
def test_some_files_big_tree_100_revision(self):
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()
272
def test_many_files_big_tree_1_revision(self):
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()
278
def test_many_files_big_tree_100_revision(self):
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()
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"),
289
for bundlefiles, bundlefiles_h in [(5, "few"), (100, "some"),
291
if bundlefiles > treesize:
293
for num_revisions in [1, 100, 1000]:
295
def test_%s_files_%s_tree_%s_revision(self):
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)