diff options
-rw-r--r-- | benchmarks/__init__.py | 0 | ||||
-rw-r--r-- | benchmarks/base.py | 46 | ||||
-rw-r--r-- | benchmarks/socket_read_size.py | 34 | ||||
-rw-r--r-- | redis/connection.py | 4 |
4 files changed, 82 insertions, 2 deletions
diff --git a/benchmarks/__init__.py b/benchmarks/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/benchmarks/__init__.py diff --git a/benchmarks/base.py b/benchmarks/base.py new file mode 100644 index 0000000..a97001f --- /dev/null +++ b/benchmarks/base.py @@ -0,0 +1,46 @@ +import functools +import itertools +import redis +import sys +import timeit +from redis._compat import izip + + +class Benchmark(object): + ARGUMENTS = () + + def __init__(self): + self._client = None + + def get_client(self, **kwargs): + # eventually make this more robust and take optional args from + # argparse + if self._client is None or kwargs: + defaults = { + 'db': 9 + } + defaults.update(kwargs) + pool = redis.ConnectionPool(**kwargs) + self._client = redis.StrictRedis(connection_pool=pool) + return self._client + + def setup(self, **kwargs): + pass + + def run(self, **kwargs): + pass + + def run_benchmark(self): + group_names = [group['name'] for group in self.ARGUMENTS] + group_values = [group['values'] for group in self.ARGUMENTS] + for value_set in itertools.product(*group_values): + pairs = list(izip(group_names, value_set)) + arg_string = ', '.join(['%s=%s' % (p[0], p[1]) for p in pairs]) + sys.stdout.write('Benchmark: %s... ' % arg_string) + sys.stdout.flush() + kwargs = dict(pairs) + setup = functools.partial(self.setup, **kwargs) + run = functools.partial(self.run, **kwargs) + t = timeit.timeit(stmt=run, setup=setup, number=1000) + sys.stdout.write('%f\n' % t) + sys.stdout.flush() diff --git a/benchmarks/socket_read_size.py b/benchmarks/socket_read_size.py new file mode 100644 index 0000000..72a1b0a --- /dev/null +++ b/benchmarks/socket_read_size.py @@ -0,0 +1,34 @@ +from redis.connection import PythonParser, HiredisParser +from base import Benchmark + + +class SocketReadBenchmark(Benchmark): + + ARGUMENTS = ( + { + 'name': 'parser', + 'values': [PythonParser, HiredisParser] + }, + { + 'name': 'value_size', + 'values': [10, 100, 1000, 10000, 100000, 1000000, 10000000, + 100000000] + }, + { + 'name': 'read_size', + 'values': [4096, 8192, 16384, 32768, 65536, 131072] + } + ) + + def setup(self, value_size, read_size, parser): + r = self.get_client(parser_class=parser, + socket_read_size=read_size) + r.set('benchmark', 'a' * value_size) + + def run(self, value_size, read_size, parser): + r = self.get_client() + r.get('benchmark') + + +if __name__ == '__main__': + SocketReadBenchmark().run_benchmark() diff --git a/redis/connection.py b/redis/connection.py index 5017b55..3364364 100644 --- a/redis/connection.py +++ b/redis/connection.py @@ -324,7 +324,7 @@ class Connection(object): def __init__(self, host='localhost', port=6379, db=0, password=None, socket_timeout=None, encoding='utf-8', encoding_errors='strict', decode_responses=False, - parser_class=DefaultParser, socket_read_size=8192): + parser_class=DefaultParser, socket_read_size=65536): self.pid = os.getpid() self.host = host self.port = port @@ -501,7 +501,7 @@ class UnixDomainSocketConnection(Connection): def __init__(self, path='', db=0, password=None, socket_timeout=None, encoding='utf-8', encoding_errors='strict', decode_responses=False, - parser_class=DefaultParser, socket_read_size=8192): + parser_class=DefaultParser, socket_read_size=65536): self.pid = os.getpid() self.path = path self.db = db |