Skip to content

Instantly share code, notes, and snippets.

@eirikrye
Created February 17, 2020 22:50
Show Gist options
  • Save eirikrye/dca124c0ebb320149627979103406b66 to your computer and use it in GitHub Desktop.
Save eirikrye/dca124c0ebb320149627979103406b66 to your computer and use it in GitHub Desktop.
multi_bench.py
import asyncio
import time
from contextlib import contextmanager
import uvloop
uvloop.install()
@contextmanager
def time_it(name: str, iterations: int):
start = time.perf_counter_ns()
yield None
elapsed = time.perf_counter_ns() - start
print(
f"[{name[:20]:20}] {iterations} iterations, {elapsed / iterations / 1000:.1f}µs/it, total: {elapsed * 1e-6:.1f}ms"
)
async def bench_aioredis(iterations: int):
import aioredis
redis = await aioredis.create_redis("redis://localhost")
await redis.flushdb()
with time_it("aioredis pipeline", iterations):
tr = redis.pipeline()
for _ in range(iterations):
tr.set("foo", "bar")
res = await tr.execute()
assert len(res) == iterations
with time_it("aioredis transaction", iterations):
tr = redis.multi_exec()
for _ in range(iterations):
tr.set("foo", "bar")
res = await tr.execute()
assert len(res) == iterations
redis.close()
await redis.wait_closed()
async def bench_aredis(iterations: int):
import aredis
redis = aredis.StrictRedis("localhost")
await redis.flushdb()
with time_it("aredis pipeline", iterations):
async with await redis.pipeline(transaction=False) as tr:
for _ in range(iterations):
await tr.set("foo", "bar")
res = await tr.execute()
assert len(res) == iterations
with time_it("aredis transaction", iterations):
async with await redis.pipeline(transaction=False) as tr:
for _ in range(iterations):
await tr.set("foo", "bar")
res = await tr.execute()
assert len(res) == iterations
async def bench_sider(iterations: int):
import sider
redis = await sider.RedisClient("localhost").connect()
await redis.command("flushdb")
with time_it("sider pipeline", iterations):
tr = redis.pipeline()
for _ in range(iterations):
tr.command("set", "foo", "bar")
res = await tr.execute()
assert len(res) == iterations
with time_it("sider transaction", iterations):
tr = redis.pipeline()
for _ in range(iterations):
tr.command("set", "foo", "bar")
res = await tr.execute(transaction=True)
assert len(res) == iterations
await redis.close()
async def main():
for iterations in [100, 1000, 10000, 50000, 100000]:
await bench_aioredis(iterations)
await bench_aredis(iterations)
# await bench_sider(iterations)
asyncio.run(main())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment