Source

startime / run.py

Full commit
#!/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):
            continue
        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, "can't 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("python"),
    script("ruby"),
    script("perl"),
    script("newlisp", "-e", "(exit)"),
    script("clisp", "-q", "-x", "(exit)"),
    script("guile", "-c", ""),
    script("mzscheme", "-e", ""),
]

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

def program(compile, run):
    name = compile[0]

    return Program(compile[0].title(), with_args(compile), with_args(run))

programs = [
    program(["gcc", "-O3", "-o", "noop", "noop.c"],
            ["./noop"]),
    program(["g++", "-O3", "-o", "noopcc", "noop.cc"],
            ["./noopcc"]),
    program(["javac", "noop.java"], ["java", "noop"]),
]

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:
        timeit(program.compile)
        runtimes.append((timeit(program.run), program.name))

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

if __name__ == "__main__":
    run()