import atexit import contextlib import os import sys import socket import socketserver import threading import timeit import time HOST = "localhost" PORT = 9999 FILESIZE = 100 * 1024 * 1024 FILENAME = "test-file" class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while 1: chunk = self.request.recv(65536) if not chunk: break def start_server(): server = socketserver.TCPServer((HOST, PORT), MyTCPHandler) server.serve_forever() def write_file(): chunk_size = int(FILESIZE / 1000) f = open(FILENAME, 'wb') atexit.register(lambda: os.remove(FILENAME)) with f: for x in range(1000): f.write(b'x' * chunk_size) def timethis(what): """"Utility function for making simple benchmarks (calculates time calls). It can be used either as a context manager or as a decorator. """ @contextlib.contextmanager def benchmark(): timer = time.clock if sys.platform == "win32" else time.time start_t = time.time() t1 = os.times() yield t2 = os.times() end_t = time.time() utime = t2[0] - t1[0] stime = t2[1] - t1[1] total = utime + stime real = end_t - start_t print(what) print("real %10.4fs\nuser %10.4fs\nsys %10.4fs\ntotal%10.4fs" % ( real, utime, stime, total)) print() if hasattr(what, "__call__"): def timed(*args, **kwargs): with benchmark(): return what(*args, **kwargs) return timed else: return benchmark() def main(): write_file() t = threading.Thread(target=start_server) t.start() time.sleep(.1) with socket.create_connection((HOST, PORT)) as s: with open(FILENAME, "rb") as f: with timethis("send()"): s._sendfile_use_send(f, blocksize=262144, offset=0) with open(FILENAME, "rb") as f: with timethis("sendfile()"): s._sendfile_use_sendfile(f, blocksize=262144, offset=0) os._exit(0) main()