Fix line endings

This commit is contained in:
Andrew Godwin 2016-02-23 21:40:52 +00:00
parent ca4e3f0af5
commit 9437dc17b5

View File

@ -1,147 +1,147 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import time import time
import random import random
from autobahn.twisted.websocket import WebSocketClientProtocol, \ from autobahn.twisted.websocket import WebSocketClientProtocol, \
WebSocketClientFactory WebSocketClientFactory
stats = {} stats = {}
class MyClientProtocol(WebSocketClientProtocol): class MyClientProtocol(WebSocketClientProtocol):
num_messages = 5 num_messages = 5
message_gap = 1 message_gap = 1
def onConnect(self, response): def onConnect(self, response):
self.opened = time.time() self.opened = time.time()
self.sent = 0 self.sent = 0
self.last_send = None self.last_send = None
self.received = 0 self.received = 0
self.corrupted = 0 self.corrupted = 0
self.out_of_order = 0 self.out_of_order = 0
self.latencies = [] self.latencies = []
self.fingerprint = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for i in range(16)) self.fingerprint = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for i in range(16))
stats[self.fingerprint] = {} stats[self.fingerprint] = {}
def onOpen(self): def onOpen(self):
def hello(): def hello():
if self.last_send is None: if self.last_send is None:
if self.sent >= self.num_messages: if self.sent >= self.num_messages:
self.sendClose() self.sendClose()
return return
self.sendMessage(("%s:%s" % (self.sent, self.fingerprint)).encode("ascii")) self.sendMessage(("%s:%s" % (self.sent, self.fingerprint)).encode("ascii"))
self.last_send = time.time() self.last_send = time.time()
self.sent += 1 self.sent += 1
else: else:
# Wait for receipt of ping # Wait for receipt of ping
pass pass
self.factory.reactor.callLater(1, hello) self.factory.reactor.callLater(1, hello)
hello() hello()
def onMessage(self, payload, isBinary): def onMessage(self, payload, isBinary):
num, fingerprint = payload.decode("ascii").split(":") num, fingerprint = payload.decode("ascii").split(":")
if fingerprint != self.fingerprint: if fingerprint != self.fingerprint:
self.corrupted += 1 self.corrupted += 1
if int(num) != self.received: if int(num) != self.received:
self.out_of_order += 1 self.out_of_order += 1
self.received += 1 self.received += 1
self.latencies.append(time.time() - self.last_send) self.latencies.append(time.time() - self.last_send)
self.last_send = None self.last_send = None
def onClose(self, wasClean, code, reason): def onClose(self, wasClean, code, reason):
if hasattr(self, "sent"): if hasattr(self, "sent"):
stats[self.fingerprint] = { stats[self.fingerprint] = {
"sent": self.sent, "sent": self.sent,
"received": self.received, "received": self.received,
"corrupted": self.corrupted, "corrupted": self.corrupted,
"out_of_order": self.out_of_order, "out_of_order": self.out_of_order,
"connect": True, "connect": True,
} }
else: else:
self.fingerprint = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for i in range(16)) self.fingerprint = "".join(random.choice("abcdefghijklmnopqrstuvwxyz") for i in range(16))
stats[self.fingerprint] = { stats[self.fingerprint] = {
"sent": 0, "sent": 0,
"received": 0, "received": 0,
"corrupted": 0, "corrupted": 0,
"out_of_order": 0, "out_of_order": 0,
"connect": False, "connect": False,
} }
class Benchmarker(object): class Benchmarker(object):
""" """
Performs benchmarks against WebSockets. Performs benchmarks against WebSockets.
""" """
def __init__(self, url, num, rate): def __init__(self, url, num, rate):
self.url = url self.url = url
self.num = num self.num = num
self.rate = rate self.rate = rate
self.factory = WebSocketClientFactory( self.factory = WebSocketClientFactory(
args.url, args.url,
debug=False, debug=False,
) )
self.factory.protocol = MyClientProtocol self.factory.protocol = MyClientProtocol
def loop(self): def loop(self):
self.spawn_connections() self.spawn_connections()
self.print_progress() self.print_progress()
reactor.callLater(1, self.loop) reactor.callLater(1, self.loop)
def spawn_connections(self): def spawn_connections(self):
if len(stats) >= self.num: if len(stats) >= self.num:
return return
for i in range(self.rate): for i in range(self.rate):
# TODO: Look at URL # TODO: Look at URL
reactor.connectTCP("127.0.0.1", 8000, self.factory) reactor.connectTCP("127.0.0.1", 8000, self.factory)
def print_progress(self): def print_progress(self):
open_protocols = len([x for x in stats.values() if not x]) open_protocols = len([x for x in stats.values() if not x])
print("%s open, %s total" % ( print("%s open, %s total" % (
open_protocols, open_protocols,
len(stats), len(stats),
)) ))
if open_protocols == 0 and len(stats) >= self.num: if open_protocols == 0 and len(stats) >= self.num:
print("Reached %s open connections, quitting" % self.num) print("Reached %s open connections, quitting" % self.num)
reactor.stop() reactor.stop()
self.print_stats() self.print_stats()
def print_stats(self): def print_stats(self):
num_incomplete = len([x for x in stats.values() if x['sent'] != x['received']]) num_incomplete = len([x for x in stats.values() if x['sent'] != x['received']])
num_corruption = len([x for x in stats.values() if x['corrupted']]) num_corruption = len([x for x in stats.values() if x['corrupted']])
num_out_of_order = len([x for x in stats.values() if x['out_of_order']]) num_out_of_order = len([x for x in stats.values() if x['out_of_order']])
num_failed = len([x for x in stats.values() if not x['connect']]) num_failed = len([x for x in stats.values() if not x['connect']])
print("-------") print("-------")
print("Sockets opened: %s" % len(stats)) print("Sockets opened: %s" % len(stats))
print("Incomplete sockets: %s (%.2f%%)" % (num_incomplete, (float(num_incomplete) / len(stats))*100)) print("Incomplete sockets: %s (%.2f%%)" % (num_incomplete, (float(num_incomplete) / len(stats))*100))
print("Corrupt sockets: %s (%.2f%%)" % (num_corruption, (float(num_corruption) / len(stats))*100)) print("Corrupt sockets: %s (%.2f%%)" % (num_corruption, (float(num_corruption) / len(stats))*100))
print("Out of order sockets: %s (%.2f%%)" % (num_out_of_order, (float(num_out_of_order) / len(stats))*100)) print("Out of order sockets: %s (%.2f%%)" % (num_out_of_order, (float(num_out_of_order) / len(stats))*100))
print("Failed to connect: %s (%.2f%%)" % (num_failed, (float(num_failed) / len(stats))*100)) print("Failed to connect: %s (%.2f%%)" % (num_failed, (float(num_failed) / len(stats))*100))
if __name__ == '__main__': if __name__ == '__main__':
import sys import sys
import argparse import argparse
from twisted.python import log from twisted.python import log
from twisted.internet import reactor from twisted.internet import reactor
# log.startLogging(sys.stdout) # log.startLogging(sys.stdout)
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("url") parser.add_argument("url")
parser.add_argument("-n", "--num", type=int, default=100) parser.add_argument("-n", "--num", type=int, default=100)
parser.add_argument("-r", "--rate", type=int, default=10) parser.add_argument("-r", "--rate", type=int, default=10)
args = parser.parse_args() args = parser.parse_args()
benchmarker = Benchmarker( benchmarker = Benchmarker(
url=args.url, url=args.url,
num=args.num, num=args.num,
rate=args.rate, rate=args.rate,
) )
benchmarker.loop() benchmarker.loop()
reactor.run() reactor.run()