hgbook
changeset 604:39b7a21c490b
Drop another dead file
author | Bryan O'Sullivan <bos@serpentine.com> |
---|---|
date | Fri Mar 27 10:04:49 2009 -0700 (2009-03-27) |
parents | 95ae6e9baf99 |
children | a21668c4af50 |
files | sillybench/sillybench.py |
line diff
1.1 --- a/sillybench/sillybench.py Fri Mar 27 12:01:13 2009 -0500 1.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 1.3 @@ -1,177 +0,0 @@ 1.4 -#!/usr/bin/python 1.5 -# 1.6 -# Silly benchmarking program, to give a vague idea of how fast a few 1.7 -# tools are on a handful of common operations. 1.8 -# 1.9 -# Use a fairly big and real source tarball to test with: Firefox 1.10 -# 2.0.0.3 (37622 files, 5374 directories, 343MB unpacked onto 1.11 -# 4KB-blocksize ext3). 1.12 - 1.13 -import csv 1.14 -import os 1.15 -import shutil 1.16 -import sys 1.17 -import tempfile 1.18 -import time 1.19 -import urllib2 1.20 - 1.21 -url = 'ftp://ftp.mozilla.org/pub/mozilla.org/firefox/releases/2.0.0.3/source/firefox-2.0.0.3-source.tar.bz2' 1.22 - 1.23 -class CommandFailure(Exception): 1.24 - pass 1.25 - 1.26 -class rcs(object): 1.27 - def __init__(self): 1.28 - self.logfp = open(self.__class__.__name__ + '.csv', 'w') 1.29 - self.csv = csv.writer(self.logfp) 1.30 - 1.31 - def download(self): 1.32 - name = url[url.rfind('/')+1:] 1.33 - path = os.path.join(os.environ['HOME'], name) 1.34 - if not os.path.isfile(path): 1.35 - ofp = open(path + '.part', 'wb') 1.36 - try: 1.37 - ifp = urllib2.urlopen(url) 1.38 - nbytes = ifp.info()['content-length'] 1.39 - sys.stdout.write('%s: %s bytes ' % (name, nbytes)) 1.40 - sys.stdout.flush() 1.41 - while True: 1.42 - data = ifp.read(131072) 1.43 - if not data: break 1.44 - sys.stdout.write('.') 1.45 - sys.stdout.flush() 1.46 - ofp.write(data) 1.47 - del ofp 1.48 - os.rename(path + '.part', path) 1.49 - except: 1.50 - if os.path.exists(path + '.part'): 1.51 - os.unlink(path + '.part') 1.52 - if os.path.exists(path): 1.53 - os.unlink(path) 1.54 - raise 1.55 - return path 1.56 - 1.57 - def run(self, args, mustsucceed=True): 1.58 - ret = os.spawnvp(os.P_WAIT, args[0], args) 1.59 - if ret < 0: 1.60 - msg = 'killed by signal %d' % (-ret) 1.61 - if ret > 0: 1.62 - msg = 'exited with status %d' % (ret) 1.63 - if ret: 1.64 - if mustsucceed: 1.65 - raise CommandFailure('%s: %s' % (msg, ' '.join(args))) 1.66 - print >> sys.stderr, 'WARNING: %s: %s' % (msg, ' '.join(args)) 1.67 - 1.68 - def time(self, *args, **kwargs): 1.69 - start = time.time() 1.70 - self.run(*args, **kwargs) 1.71 - end = time.time() 1.72 - return end - start 1.73 - 1.74 - def logtime(self, name, elapsed, rest=[]): 1.75 - self.log('time:' + name, '%.3f' % elapsed, rest) 1.76 - 1.77 - def log(self, name, value, rest=[]): 1.78 - item = (name, value, repr(rest)) 1.79 - print ' '.join(item) 1.80 - self.csv.writerow(item) 1.81 - self.logfp.flush() 1.82 - 1.83 - def unpack(self): 1.84 - tarball = self.download() 1.85 - t = self.time(['tar', '-C', self.wdir, '-jxf', tarball]) 1.86 - self.logtime('internal:untar', t) 1.87 - for name in os.listdir(os.path.join(self.wdir, 'mozilla')): 1.88 - os.rename(os.path.join(self.wdir, 'mozilla', name), 1.89 - os.path.join(self.wdir, name)) 1.90 - 1.91 - def cleanup(self): 1.92 - pass 1.93 - 1.94 - def add(self, paths): 1.95 - pass 1.96 - 1.97 - def commit(self, msg, paths): 1.98 - pass 1.99 - 1.100 - def status(self, path): 1.101 - pass 1.102 - 1.103 - def remove(self, path): 1.104 - pass 1.105 - 1.106 - 1.107 -class subversion(rcs): 1.108 - def __init__(self, root): 1.109 - rcs.__init__(self) 1.110 - self.repo = os.path.join(root, 'repo') 1.111 - self.wdir = os.path.join(root, 'wc') 1.112 - create = self.time(['svnadmin', 'create', '--fs-type=fsfs', self.repo]) 1.113 - self.logtime('svn:create', create) 1.114 - co = self.time(['svn', 'co', 'file://' + self.repo, self.wdir]) 1.115 - self.logtime('svn:co', co) 1.116 - self.logtime('init', create + co) 1.117 - os.chdir(self.wdir) 1.118 - 1.119 - def dropmeta(self, names): 1.120 - return [n for n in names if os.path.basename(n) != '.svn'] 1.121 - 1.122 - def add(self, paths): 1.123 - t = self.time(['svn', 'add', '-q'] + paths) 1.124 - self.logtime('add %r' % paths, t) 1.125 - 1.126 - def commit(self, msg, paths=[]): 1.127 - if paths: 1.128 - t = self.time(['svn', 'ci', '-q', '-m', msg] + paths) 1.129 - else: 1.130 - t = self.time(['svn', 'ci', '-q', '-m', msg]) 1.131 - self.logtime('commit %r' % paths, t) 1.132 - 1.133 - 1.134 -class mercurial(rcs): 1.135 - def __init__(self, root): 1.136 - rcs.__init__(self) 1.137 - self.repo = os.path.join(root, 'repo') 1.138 - self.wdir = self.repo 1.139 - init = self.time(['hg', 'init', self.repo]) 1.140 - self.logtime('init', init) 1.141 - os.chdir(self.wdir) 1.142 - 1.143 - def dropmeta(self, names): 1.144 - return [n for n in names if os.path.basename(n) != '.hg'] 1.145 - 1.146 - def add(self, paths): 1.147 - t = self.time(['hg', 'add', '-q'] + paths) 1.148 - self.logtime('add %r' % paths, t) 1.149 - 1.150 - def commit(self, msg, paths=[]): 1.151 - if paths: 1.152 - t = self.time(['hg', 'ci', '-q', '-m', msg] + paths) 1.153 - else: 1.154 - t = self.time(['hg', 'ci', '-q', '-m', msg]) 1.155 - self.logtime('commit %r' % paths, t) 1.156 - 1.157 -def benchmark(cls): 1.158 - oldcwd = os.getcwd() 1.159 - root = tempfile.mkdtemp(prefix='sillybench.') 1.160 - try: 1.161 - print 'root', root 1.162 - inst = cls(root) 1.163 - inst.unpack() 1.164 - names = inst.dropmeta(os.listdir('.')) 1.165 - dirs = [n for n in names if os.path.isdir(n)] 1.166 - nondirs = [n for n in names if not os.path.isdir(n)] 1.167 - dirs.sort(key=hash) 1.168 - names.sort(key=hash) 1.169 - for d in dirs[:len(dirs)/2]: 1.170 - inst.add([d]) 1.171 - inst.commit('Add %r' % d, [d]) 1.172 - inst.add(dirs[len(dirs)/2:] + names) 1.173 - inst.commit('Add remaining dirs and files') 1.174 - finally: 1.175 - print >> sys.stderr, '[cleaning up...]' 1.176 - shutil.rmtree(root) 1.177 - os.chdir(oldcwd) 1.178 - 1.179 -benchmark(mercurial) 1.180 -#benchmark(subversion)