aboutsummaryrefslogtreecommitdiff
path: root/test/git/performance
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2010-06-03 23:20:34 +0200
committerSebastian Thiel <byronimo@gmail.com>2010-06-03 23:20:34 +0200
commit1e2b46138ba58033738a24dadccc265748fce2ca (patch)
tree0f2a625a371c16cc95e53e024e007d8b89d87c92 /test/git/performance
parent4b4a514e51fbc7dc6ddcb27c188159d57b5d1fa9 (diff)
downloadGitPython-1e2b46138ba58033738a24dadccc265748fce2ca.tar.gz
GitPython-1e2b46138ba58033738a24dadccc265748fce2ca.zip
commit.create_from_tree now uses pure python implementation, fixed message parsing which truncated newlines although it was ilegitimate. Its up to the reader to truncate therse, nowhere in the git code I could find anyone adding newlines to commits where it is written
Added performance tests for serialization, it does about 5k commits per second if writing to tmpfs
Diffstat (limited to 'test/git/performance')
-rw-r--r--test/git/performance/lib.py25
-rw-r--r--test/git/performance/test_commit.py36
-rw-r--r--test/git/performance/test_odb.py6
-rw-r--r--test/git/performance/test_streams.py4
-rw-r--r--test/git/performance/test_utils.py4
5 files changed, 62 insertions, 13 deletions
diff --git a/test/git/performance/lib.py b/test/git/performance/lib.py
index 4b552b20..650bea82 100644
--- a/test/git/performance/lib.py
+++ b/test/git/performance/lib.py
@@ -1,6 +1,8 @@
"""Contains library functions"""
import os
from test.testlib import *
+import shutil
+import tempfile
from git import (
Repo
@@ -25,7 +27,7 @@ def resolve_or_fail(env_var):
#{ Base Classes
-class TestBigRepoReadOnly(TestBase):
+class TestBigRepoR(TestBase):
"""TestCase providing access to readonly 'big' repositories using the following
member variables:
@@ -40,7 +42,24 @@ class TestBigRepoReadOnly(TestBase):
@classmethod
def setUpAll(cls):
- super(TestBigRepoReadOnly, cls).setUpAll()
- cls.gitrepo = Repo(resolve_or_fail(k_env_git_repo))
+ super(TestBigRepoR, cls).setUpAll()
+ cls.gitrorepo = Repo(resolve_or_fail(k_env_git_repo))
+
+class TestBigRepoRW(TestBigRepoR):
+ """As above, but provides a big repository that we can write to.
+
+ Provides ``self.gitrwrepo``"""
+
+ @classmethod
+ def setUpAll(cls):
+ super(TestBigRepoRW, cls).setUpAll()
+ dirname = tempfile.mktemp()
+ os.mkdir(dirname)
+ cls.gitrwrepo = cls.gitrorepo.clone(dirname, shared=True, bare=True)
+
+ @classmethod
+ def tearDownAll(cls):
+ shutil.rmtree(cls.gitrwrepo.working_tree_dir)
+
#} END base classes
diff --git a/test/git/performance/test_commit.py b/test/git/performance/test_commit.py
index b4a9d868..2398c93d 100644
--- a/test/git/performance/test_commit.py
+++ b/test/git/performance/test_commit.py
@@ -6,10 +6,12 @@
from lib import *
from git import *
+from test.git.test_commit import assert_commit_serialization
+from cStringIO import StringIO
from time import time
import sys
-class TestPerformance(TestBigRepoReadOnly):
+class TestPerformance(TestBigRepoRW):
# ref with about 100 commits in its history
ref_100 = '0.1.6'
@@ -48,7 +50,7 @@ class TestPerformance(TestBigRepoReadOnly):
# bound to cat-file parsing performance
nc = 0
st = time()
- for c in self.gitrepo.commit(self.head_sha_2k).traverse(branch_first=False):
+ for c in self.gitrorepo.commit(self.head_sha_2k).traverse(branch_first=False):
nc += 1
self._query_commit_info(c)
# END for each traversed commit
@@ -59,10 +61,38 @@ class TestPerformance(TestBigRepoReadOnly):
# bound to stream parsing performance
nc = 0
st = time()
- for c in Commit.iter_items(self.gitrepo, self.head_sha_2k):
+ for c in Commit.iter_items(self.gitrorepo, self.head_sha_2k):
nc += 1
self._query_commit_info(c)
# END for each traversed commit
elapsed_time = time() - st
print >> sys.stderr, "Iterated %i Commits in %s [s] ( %f commits/s )" % (nc, elapsed_time, nc/elapsed_time)
+ def test_commit_serialization(self):
+ assert_commit_serialization(self.gitrwrepo, self.head_sha_2k, True)
+
+ rwrepo = self.gitrwrepo
+ make_object = rwrepo.odb.to_object
+ # direct serialization - deserialization can be tested afterwards
+ # serialization is probably limited on IO
+ hc = rwrepo.commit(self.head_sha_2k)
+
+ commits = list()
+ nc = 5000
+ st = time()
+ for i in xrange(nc):
+ cm = Commit( rwrepo, Commit.NULL_HEX_SHA, hc.tree,
+ hc.author, hc.authored_date, hc.author_tz_offset,
+ hc.committer, hc.committed_date, hc.committer_tz_offset,
+ str(i), parents=hc.parents, encoding=hc.encoding)
+
+ stream = StringIO()
+ cm._serialize(stream)
+ slen = stream.tell()
+ stream.seek(0)
+
+ cm.sha = make_object(Commit.type, slen, stream)
+ # END commit creation
+ elapsed = time() - st
+
+ print >> sys.stderr, "Serialized %i commits to loose objects in %f s ( %f commits / s )" % (nc, elapsed, nc / elapsed)
diff --git a/test/git/performance/test_odb.py b/test/git/performance/test_odb.py
index 0ad2ce33..7b1ee838 100644
--- a/test/git/performance/test_odb.py
+++ b/test/git/performance/test_odb.py
@@ -5,18 +5,18 @@ import sys
import stat
from lib import (
- TestBigRepoReadOnly
+ TestBigRepoR
)
-class TestObjDBPerformance(TestBigRepoReadOnly):
+class TestObjDBPerformance(TestBigRepoR):
def test_random_access(self):
# GET COMMITS
# TODO: use the actual db for this
st = time()
- root_commit = self.gitrepo.commit(self.head_sha_2k)
+ root_commit = self.gitrorepo.commit(self.head_sha_2k)
commits = list(root_commit.traverse())
nc = len(commits)
elapsed = time() - st
diff --git a/test/git/performance/test_streams.py b/test/git/performance/test_streams.py
index 6c2834b3..d31bee14 100644
--- a/test/git/performance/test_streams.py
+++ b/test/git/performance/test_streams.py
@@ -14,7 +14,7 @@ import subprocess
from lib import (
- TestBigRepoReadOnly
+ TestBigRepoR
)
@@ -32,7 +32,7 @@ def make_memory_file(size_in_bytes, randomize=False):
return actual_size*4, StringIO(a.tostring())
-class TestObjDBPerformance(TestBigRepoReadOnly):
+class TestObjDBPerformance(TestBigRepoR):
large_data_size_bytes = 1000*1000*10 # some MiB should do it
moderate_data_size_bytes = 1000*1000*1 # just 1 MiB
diff --git a/test/git/performance/test_utils.py b/test/git/performance/test_utils.py
index 381d7c8b..47366d34 100644
--- a/test/git/performance/test_utils.py
+++ b/test/git/performance/test_utils.py
@@ -4,11 +4,11 @@ import sys
import stat
from lib import (
- TestBigRepoReadOnly
+ TestBigRepoR
)
-class TestUtilPerformance(TestBigRepoReadOnly):
+class TestUtilPerformance(TestBigRepoR):
def test_access(self):
# compare dict vs. slot access