summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJordan Cook <jordan.cook@pioneer.com>2021-08-20 23:17:06 -0500
committerJordan Cook <jordan.cook@pioneer.com>2021-08-20 23:17:06 -0500
commite6fff586cd94685e7a8354170e070cb692ad4430 (patch)
treebae47940232ba51b07c8a3cab5298cc18dcd384a
parent9c89fe2a5f696e2ea786fb368529e3cb421c0b57 (diff)
downloadrequests-cache-e6fff586cd94685e7a8354170e070cb692ad4430.tar.gz
Add CLI arg to benchmark script to select a backend
-rw-r--r--docs/examples.md4
-rwxr-xr-xexamples/benchmark.py69
-rw-r--r--requests_cache/backends/dynamodb.py4
-rw-r--r--requests_cache/backends/sqlite.py2
4 files changed, 62 insertions, 17 deletions
diff --git a/docs/examples.md b/docs/examples.md
index 4e5df65..0ed67f5 100644
--- a/docs/examples.md
+++ b/docs/examples.md
@@ -68,13 +68,13 @@ The following scripts can also be found in the
### Cache speed test
```{include} ../examples/benchmark.py
:start-line: 2
-:end-line: 3
+:end-line: 8
```
:::{admonition} Example code
:class: toggle
```{literalinclude} ../examples/benchmark.py
-:lines: 1,5-
+:lines: 1,10-
```
:::
diff --git a/examples/benchmark.py b/examples/benchmark.py
index b37ffef..6992b9a 100755
--- a/examples/benchmark.py
+++ b/examples/benchmark.py
@@ -1,46 +1,75 @@
#!/usr/bin/env python
"""
An example of benchmarking cache write speeds with semi-randomized response content
+
+Usage:
+```
+python benchmark.py -b <backend name>
+```
"""
+from argparse import ArgumentParser
from os import urandom
from random import random
from time import perf_counter as time
import requests
+from rich import print
+from rich.progress import Progress
from requests_cache import CachedResponse, CachedSession
BASE_RESPONSE = requests.get('https://httpbin.org/get')
-CACHE_NAME = 'rubbish_bin.sqlite'
+CACHE_NAME = 'rubbish_bin'
+WARMUP_ITERATIONS = 100
ITERATIONS = 5000
-MAX_RESPONSE_SIZE = 1024 * 1024
+MAX_RESPONSE_SIZE = 1024 * 350
+# Defaults for DynamoDB
+AWS_OPTIONS = {
+ 'endpoint_url': 'http://localhost:8000',
+ 'region_name': 'us-east-1',
+ 'aws_access_key_id': 'placeholder',
+ 'aws_secret_access_key': 'placeholder',
+}
-def test_write_speed(session):
- print(f'Testing write speed over {ITERATIONS} iterations')
- start = time()
- for i in range(ITERATIONS):
+def test_write_speed(session):
+ for i in range(WARMUP_ITERATIONS):
new_response = get_randomized_response(i)
session.cache.save_response(new_response)
+ with Progress() as progress:
+ task = progress.add_task('[cyan]Testing write speed...', total=ITERATIONS)
+ start = time()
+
+ for i in range(ITERATIONS):
+ new_response = get_randomized_response(i)
+ session.cache.save_response(new_response)
+ progress.update(task, advance=1)
+
elapsed = time() - start
avg = (elapsed / ITERATIONS) * 1000
- print(f'Elapsed: {elapsed:.3f} (avg {avg:.3f}ms per write)')
+ print(f'[cyan]Elapsed: [green]{elapsed:.3f}[/] seconds (avg [green]{avg:.3f}[/] ms per write)')
def test_read_speed(session):
- print(f'Testing read speed over {ITERATIONS} iterations')
keys = list(session.cache.responses.keys())
- start = time()
-
- for i in range(ITERATIONS):
- key = keys[i % ITERATIONS]
+ for i in range(WARMUP_ITERATIONS):
+ key = keys[i % len(keys)]
session.cache.get_response(key)
+ with Progress() as progress:
+ task = progress.add_task('[cyan]Testing read speed...', total=ITERATIONS)
+ start = time()
+
+ for i in range(ITERATIONS):
+ key = keys[i % len(keys)]
+ session.cache.get_response(key)
+ progress.update(task, advance=1)
+
elapsed = time() - start
avg = (elapsed / ITERATIONS) * 1000
- print(f'Elapsed: {elapsed:.3f} (avg {avg:.3f}ms per read)')
+ print(f'[cyan]Elapsed: [green]{elapsed:.3f}[/] seconds (avg [green]{avg:.3f}[/] ms per read)')
def get_randomized_response(i=0):
@@ -53,6 +82,18 @@ def get_randomized_response(i=0):
if __name__ == '__main__':
- session = CachedSession(CACHE_NAME, backend='sqlite')
+ parser = ArgumentParser()
+ parser.add_argument('-b', '--backend', default='sqlite')
+ args = parser.parse_args()
+ print(f'[cyan]Benchmarking {args.backend} backend')
+
+ kwargs = {}
+ if args.backend == 'dynamodb':
+ kwargs = AWS_OPTIONS
+ elif args.backend == 'sqlite-memory':
+ args.backend = 'sqlite'
+ kwargs = {'use_memory': True}
+
+ session = CachedSession(CACHE_NAME, backend=args.backend, **kwargs)
test_write_speed(session)
test_read_speed(session)
diff --git a/requests_cache/backends/dynamodb.py b/requests_cache/backends/dynamodb.py
index b97952a..d30d55f 100644
--- a/requests_cache/backends/dynamodb.py
+++ b/requests_cache/backends/dynamodb.py
@@ -7,6 +7,10 @@ Services <https://aws.amazon.com>`_. In terms of features and use cases, it is r
MongoDB and other NoSQL databases. It is an especially good fit for serverless applications running
on `AWS Lambda <https://aws.amazon.com/lambda>`_.
+.. warning::
+ DynamoDB binary item sizes are limited to 400KB. If you need to cache larger responses, consider
+ using a different backend.
+
Connection Options
^^^^^^^^^^^^^^^^^^
The DynamoDB backend accepts any keyword arguments for :py:meth:`boto3.session.Session.resource`.
diff --git a/requests_cache/backends/sqlite.py b/requests_cache/backends/sqlite.py
index 4429bc9..a66e228 100644
--- a/requests_cache/backends/sqlite.py
+++ b/requests_cache/backends/sqlite.py
@@ -92,7 +92,7 @@ When working with average-sized HTTP responses (< 1MB) and using a modern SSD fo
can expect speeds of around:
* Write: 2-8ms
-* Read: 0.3-0.6ms
+* Read: 0.2-0.6ms
Of course, this will vary based on hardware specs, response size, and other factors.