1. Miki Tebeka
  2. startime


startime / run.py

#!/usr/bin/env python

from time import time
from subprocess import call
from os import environ, stat
from stat import S_IXUSR
from os.path import isfile, join
from collections import namedtuple

def which(name):
    for path in environ['PATH'].split(':'):
        full = join(path, name)
        if not isfile(full):
        if stat(full).st_mode & S_IXUSR:
            return full

def with_args(command, **kw):
    name, args = command[0], command[1:]

    full = name if ('/' in name) else which(name)

    assert full, 'cannot find %s' % name

    if (not args) and kw.get('arg'):
        args = [kw['arg']]

    return [full] + list(args)

Script = namedtuple('Script', ['name', 'command'])

def script(*args):
    cmd = with_args(args, arg='/dev/null')

    return Script(args[0].title(), cmd)

scripts = [
    script('newlisp', '-e', '(exit)'),
    script('clisp', '-q', '-x', '(exit)'),
    script('guile', '-c', ''),
    script('mzscheme', '-e', ''),
    script('prolog', '-q', '-t', 'halt')

Program = namedtuple('Program', ['name', 'compile', 'run'])

def program(compile, run, **kw):
    name = kw.get('name') or compile[0]

    return Program(name.title(), with_args(compile), with_args(run))

programs = [
    program(['gcc', '-O3', '-o', 'noop', 'noop.c'],
    program(['g++', '-O3', '-o', 'noopcc', 'noop.cc'],
    program(['javac', 'noop.java'], ['java', 'noop'], name='java'),
    program(['gmcs', '-optimize+', 'noop.cs'], ['./noop.exe'], name='mono'),
    program(['ghc', '-v0', '-O', '-o', 'noophs', 'noop.hs'], ['./noophs']),
    program(['./go.sh', 'noop.go'], ['./noopgo'], name='go'),

def timeit(command):
    start = time()
    with open('/dev/null', 'wb') as fo:
        retval = call(command, shell=0, stdout=fo)
    end = time()

    assert retval == 0, '%s' % ' '.join(command)

    return end - start

def run():
    runtimes = []
    for script in scripts:
        start = time()
        runtimes.append((timeit(script.command), script.name))

    for program in programs:
        runtimes.append((timeit(program.run), program.name))

    maxlen = max((len(rt[1]) for rt in runtimes)) + 1
    for runtime, name in runtimes:
        print '%-*s: %f' % (maxlen, name, runtime)

if __name__ == '__main__':