contrib/revsetbenchmarks.py
changeset 25539 460922c95643
parent 25538 caff256205ea
child 25540 f08ad5d17e43
equal deleted inserted replaced
25538:caff256205ea 25539:460922c95643
     9 # call with --help for details
     9 # call with --help for details
    10 
    10 
    11 import sys
    11 import sys
    12 import os
    12 import os
    13 import re
    13 import re
       
    14 import math
    14 from subprocess import check_call, Popen, CalledProcessError, STDOUT, PIPE
    15 from subprocess import check_call, Popen, CalledProcessError, STDOUT, PIPE
    15 # cannot use argparse, python 2.7 only
    16 # cannot use argparse, python 2.7 only
    16 from optparse import OptionParser
    17 from optparse import OptionParser
    17 
    18 
    18 def check_output(*args, **kwargs):
    19 def check_output(*args, **kwargs):
   101         nbidx //= 10
   102         nbidx //= 10
   102     if not idxwidth:
   103     if not idxwidth:
   103         idxwidth = 1
   104         idxwidth = 1
   104     return idxwidth
   105     return idxwidth
   105 
   106 
   106 def printresult(idx, data, maxidx, verbose=False):
   107 def getfactor(main, other, field, sensitivity=0.05):
       
   108     """return the relative factor between values for 'field' in main and other
       
   109 
       
   110     Return None if the factor is insignicant (less than <sensitivity>
       
   111     variation)."""
       
   112     factor = 1
       
   113     if main is not None:
       
   114         factor = other[field] / main[field]
       
   115     low, high = 1 - sensitivity, 1 + sensitivity
       
   116     if (low < factor < high):
       
   117         return None
       
   118     return factor
       
   119 
       
   120 def formatfactor(factor):
       
   121     """format a factor into a 4 char string
       
   122 
       
   123      22%
       
   124     156%
       
   125     x2.4
       
   126      x23
       
   127     x789
       
   128     x1e4
       
   129     x5x7
       
   130 
       
   131     """
       
   132     if factor is None:
       
   133         return '    '
       
   134     elif factor < 2:
       
   135         return '%3i%%' % (factor * 100)
       
   136     elif factor < 10:
       
   137         return 'x%3.1f' % factor
       
   138     elif factor < 1000:
       
   139         return '%4s' % ('x%i' % factor)
       
   140     else:
       
   141         order = int(math.log(factor)) + 1
       
   142         while 1 < math.log(factor):
       
   143             factor //= 0
       
   144         return 'x%ix%i' % (factor, order)
       
   145 
       
   146 _marker = object()
       
   147 def printresult(idx, data, maxidx, verbose=False, reference=_marker):
   107     """print a line of result to stdout"""
   148     """print a line of result to stdout"""
   108     mask = '%%0%ii) %%s' % idxwidth(maxidx)
   149     mask = '%%0%ii) %%s' % idxwidth(maxidx)
   109     out = ['%10.6f' % data['wall']]
   150     out = ['%10.6f' % data['wall']]
       
   151     if reference is not _marker:
       
   152         factor = None
       
   153         if reference is not None:
       
   154             factor = getfactor(reference, data, 'wall')
       
   155         out.append(formatfactor(factor))
   110     if verbose:
   156     if verbose:
   111         out.append('%10.6f' % data['comb'])
   157         out.append('%10.6f' % data['comb'])
   112         out.append('%10.6f' % data['user'])
   158         out.append('%10.6f' % data['user'])
   113         out.append('%10.6f' % data['sys'])
   159         out.append('%10.6f' % data['sys'])
   114         out.append('%6d'    % data['count'])
   160         out.append('%6d'    % data['count'])
   115     print mask % (idx, ' '.join(out))
   161     print mask % (idx, ' '.join(out))
   116 
   162 
   117 def printheader(maxidx, verbose=False):
   163 def printheader(maxidx, verbose=False, relative=False):
   118     header = [' ' * (idxwidth(maxidx) + 1),
   164     header = [' ' * (idxwidth(maxidx) + 1),
   119               '  %-8s' % 'time']
   165               '  %-8s' % 'time']
       
   166     if relative:
       
   167         header.append('    ')
   120     if verbose:
   168     if verbose:
   121         header.append('  %-8s' % 'comb')
   169         header.append('  %-8s' % 'comb')
   122         header.append('  %-8s' % 'user')
   170         header.append('  %-8s' % 'user')
   123         header.append('  %-8s' % 'sys')
   171         header.append('  %-8s' % 'sys')
   124         header.append('%6s' % 'count')
   172         header.append('%6s' % 'count')
   206 print
   254 print
   207 
   255 
   208 for ridx, rset in enumerate(revsets):
   256 for ridx, rset in enumerate(revsets):
   209 
   257 
   210     print "revset #%i: %s" % (ridx, rset)
   258     print "revset #%i: %s" % (ridx, rset)
   211     printheader(len(results), verbose=options.verbose)
   259     printheader(len(results), verbose=options.verbose, relative=True)
       
   260     ref = None
   212     for idx, data in enumerate(results):
   261     for idx, data in enumerate(results):
   213         printresult(idx, data[ridx], len(results), verbose=options.verbose)
   262         printresult(idx, data[ridx], len(results), verbose=options.verbose,
       
   263                     reference=ref)
       
   264         ref = data[ridx]
   214     print
   265     print