"""A silly I/O benchmark."""

import io
import os
import time

TFN = "@bench" # Test filename
N = 64*1024*1024 # Number of bytes to read/write

def writer():
    buffer = bytes("X")*(8*1024)
    bufsize = len(buffer)
    file = io.open(TFN, "wb", bufsize=0)
    try:
        size = 0
        while size < N:
            file.write(buffer)
            size += bufsize
    finally:
        file.close()
    assert os.path.getsize(TFN) == N

def oldwriter():
    buffer = "X"*(8*1024)
    bufsize = len(buffer)
    file = open(TFN, "wb", bufsize)
    try:
        size = 0
        while size < N:
            file.write(buffer)
            size += bufsize
    finally:
        file.close()
    assert os.path.getsize(TFN) == N

def reader():
    buffer = bytes()
    bufsize = 32*1024
    file = io.open(TFN, "rb", 8*1024)
    try:
        while len(buffer) < N:
            buffer += file.read(bufsize)
    finally:
        file.close()
    assert len(buffer) == os.path.getsize(TFN) == N

def oldreader():
    bufsize = 32*1024
    f = open(TFN, "rb", 8*1024)
    try:
        buffer = ""
        while len(buffer) < N:
            buffer += f.read(bufsize)
    finally:
        f.close()
    assert len(buffer) == os.path.getsize(TFN) == N

def timeit(func):
    t0, c0 = time.time(), time.clock()
    func()
    t1, c1 = time.time(), time.clock()
    print "%s: %6.3f time, %6.3f clock" % (func.__name__, t1-t0, c1-c0)

def main():
    for i in range(1):
        timeit(writer)
        timeit(reader)
        os.remove(TFN)
        timeit(oldwriter)
        timeit(oldreader)
        os.remove(TFN)

if __name__ == "__main__":
    main()
