#!/usr/bin/python
import sys, urllib, htmllib, httplib, ftplib, formatter, urlparse, socket
import re, signal, getopt
import time, os, resource
import stats, string, Scientific.Statistics, Numeric
real_times = []
user_times = []
sys_times = []
total_real_times = []
total_user_times = []
total_sys_times = []
def parse_log(filename):
global real_times, user_times, sys_times
real_times = []
user_times = []
sys_times = []
file = open(filename, "r");
if file:
for line in file.readlines():
if line[-1] == '\n':
line = line[:-1]
words = string.split(line)
if(len(words) == 2):
if(words[0] == "real"):
real_times.append(float(words[1]))
if(words[0] == "user"):
user_times.append(float(words[1]))
if(words[0] == "sys"):
sys_times.append(float(words[1]))
else:
print "Unrecognized line: " + line
else:
print "Can't open " + filename
def parse_log_list(filenames):
for file in filenames:
parse_log(file)
if(len(total_real_times) == 0):
total_real_times = real_times
total_user_times = user_times
total_sys_times = sys_times
elif (len(total_real_times) != len(real_times)):
print "Ignoring " + file + " - wrong number of times."
else:
for i in range(len(real_times)):
total_real_times[i] += real_times[i]
total_user_times[i] += user_times[i]
total_sys_times[i] += sys_times[i]
def run_once(command):
start_real = time.time()
rusage = resource.getrusage(resource.RUSAGE_CHILDREN)
start_user = rusage.ru_utime
start_sys = rusage.ru_stime
ret = os.spawnvp(os.P_WAIT, command[0], command)
total_real_times.append(time.time() - start_real)
rusage = resource.getrusage(resource.RUSAGE_CHILDREN)
total_user_times.append(rusage.ru_utime - start_user)
total_sys_times.append(rusage.ru_stime - start_sys)
if ret > 0:
print 'Exited with status %d' % ret
elif ret < 0:
print 'Exited with signal %d' % -ret
def dump_times():
times = []
for i in xrange(niters):
times.append((total_real_times[i], total_user_times[i], total_sys_times[i]))
times.sort(lambda x, y: cmp(x[0], y[0]))
for time in times:
print "real %8.5fs user %8.5fs sys %8.5fs" \
% time
def run_command(command, niters):
for i in xrange(niters):
run_once(command)
# dump_times()
min = 0
for i in xrange(niters):
if total_real_times[i] < total_real_times[min]:
min = i
print "Minimum: real %8.5fs user %8.5fs sys %8.5fs" \
% (total_real_times[min], total_user_times[min], total_sys_times[min])
del total_real_times[min]
del total_user_times[min]
del total_sys_times[min]
max = 0
for i in xrange(niters-1):
if total_real_times[i] > total_real_times[max]:
max = i
print "Maximum: real %8.5fs user %8.5fs sys %8.5fs" \
% (total_real_times[max], total_user_times[max], total_sys_times[max])
del total_real_times[max]
del total_user_times[max]
del total_sys_times[max]
files = False
niters = 5
opts, args = getopt.getopt (sys.argv[1:], 'fn:')
for pair in opts:
if pair[0] == '-f':
files = True
elif pair[0] == '-n':
niters = int(pair[1])
else:
sys.exit(1)
if (files):
parse_log_list(args)
else:
run_command(args, niters)
total_real_times = Numeric.array (total_real_times, Numeric.Float)
total_sys_times = Numeric.array (total_sys_times, Numeric.Float)
total_user_times = Numeric.array (total_user_times, Numeric.Float)
real_average = Scientific.Statistics.average(total_real_times)
#real_variance = Scientific.Statistics.variance(total_real_times)
real_stddev = Scientific.Statistics.standardDeviation(total_real_times)
user_average = Scientific.Statistics.average(total_user_times)
#user_variance = Scientific.Statistics.variance(total_user_times)
user_stddev = Scientific.Statistics.standardDeviation(total_user_times)
sys_average = Scientific.Statistics.average(total_sys_times)
#sys_variance = Scientific.Statistics.variance(total_sys_times)
sys_stddev = Scientific.Statistics.standardDeviation(total_sys_times)
print "Average: real %8.5fs user %8.5fs sys %8.5fs" % (real_average, user_average, sys_average)
print "StdDev: real %8.5f user %8.5f sys %8.5f" % (real_stddev, user_stddev, sys_stddev)