Skip to content

Commit b41f80f

Browse files
committed
Added database cache benchmark
1 parent 9c4816e commit b41f80f

File tree

5 files changed

+233
-0
lines changed

5 files changed

+233
-0
lines changed

benchmarks/cache_benchmarks/__init__.py

Whitespace-only changes.

benchmarks/cache_benchmarks/database_cache/__init__.py

Whitespace-only changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import random
2+
3+
from django.core.cache import caches
4+
from django.core.management import call_command
5+
6+
from ...utils import bench_setup
7+
8+
9+
class DatabaseCacheBackend:
10+
def setup(self):
11+
bench_setup()
12+
call_command("createcachetable", verbosity=0)
13+
random.seed(0)
14+
15+
self.cache = caches["db"]
16+
self.int_key = "int_key"
17+
self.cache.set(self.int_key, 0)
18+
19+
def time_add(self):
20+
for _ in range(100):
21+
self.cache.set(self.random_key(), self.random_binary())
22+
23+
def time_get(self):
24+
for _ in range(100):
25+
self.cache.get(self.random_key())
26+
27+
def time_set(self):
28+
for _ in range(100):
29+
self.cache.set(self.random_key(), self.random_binary())
30+
31+
def time_delete(self):
32+
for _ in range(100):
33+
self.cache.delete(self.random_key())
34+
35+
def time_get_many(self):
36+
for _ in range(100):
37+
self.cache.get_many([self.random_key() for x in range(100)])
38+
39+
def time_set_many(self):
40+
for _ in range(100):
41+
self.cache.set_many(
42+
{self.random_key(): self.random_binary() for x in range(100)}
43+
)
44+
45+
def time_delete_many(self):
46+
for _ in range(100):
47+
self.cache.delete_many([self.random_key() for x in range(100)])
48+
49+
def time_clear(self):
50+
for _ in range(100):
51+
self.cache.clear()
52+
53+
def time_incr(self):
54+
for _ in range(100):
55+
self.cache.incr(self.int_key)
56+
57+
def time_decr(self):
58+
for _ in range(100):
59+
self.cache.incr(self.int_key)
60+
61+
def random_key(self):
62+
return "key_{}".format(random.randint(1, 500))
63+
64+
def random_binary(self):
65+
return random.randint(1, 1024**1) * random.randint(0, 255)

benchmarks/settings.py

+8
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@
5454
"benchmarks.query_benchmarks.query_select_related",
5555
"benchmarks.req_resp_benchmarks.default_middleware",
5656
"benchmarks.req_resp_benchmarks.http_methods",
57+
"benchmarks.cache_benchmarks.database_cache",
5758
]
5859

5960
SECRET_KEY = "NOT REALLY SECRET"
@@ -84,3 +85,10 @@
8485
},
8586
},
8687
]
88+
89+
CACHES = {
90+
"db": {
91+
"BACKEND": "django.core.cache.backends.db.DatabaseCache",
92+
"LOCATION": "cache_table",
93+
},
94+
}

results/benchmarks.json

+160
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,164 @@
11
{
2+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_add": {
3+
"code": "class DatabaseCacheBackend:\n def time_add(self):\n for _ in range(100):\n self.cache.set(self.random_key(), self.random_binary())\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
4+
"min_run_count": 2,
5+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_add",
6+
"number": 0,
7+
"param_names": [],
8+
"params": [],
9+
"repeat": 0,
10+
"rounds": 2,
11+
"sample_time": 0.01,
12+
"timeout": 60.0,
13+
"type": "time",
14+
"unit": "seconds",
15+
"version": "5a37d56c5b904afc019fa0fd55c86b25c285ab6d0a74ed2d8c7e9c0f9bcaf3d5",
16+
"warmup_time": -1
17+
},
18+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_clear": {
19+
"code": "class DatabaseCacheBackend:\n def time_clear(self):\n for _ in range(100):\n self.cache.clear()\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
20+
"min_run_count": 2,
21+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_clear",
22+
"number": 0,
23+
"param_names": [],
24+
"params": [],
25+
"repeat": 0,
26+
"rounds": 2,
27+
"sample_time": 0.01,
28+
"timeout": 60.0,
29+
"type": "time",
30+
"unit": "seconds",
31+
"version": "949122620be7c68cbd7249e8ef151cd794a7f7e82f2d703ec2d65a3f7b72ab72",
32+
"warmup_time": -1
33+
},
34+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_decr": {
35+
"code": "class DatabaseCacheBackend:\n def time_decr(self):\n for _ in range(100):\n self.cache.incr(self.int_key)\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
36+
"min_run_count": 2,
37+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_decr",
38+
"number": 0,
39+
"param_names": [],
40+
"params": [],
41+
"repeat": 0,
42+
"rounds": 2,
43+
"sample_time": 0.01,
44+
"timeout": 60.0,
45+
"type": "time",
46+
"unit": "seconds",
47+
"version": "910b3549f472fa8615e1be10da91f88f6d90bca9bce2e570f95228692cbc5444",
48+
"warmup_time": -1
49+
},
50+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_delete": {
51+
"code": "class DatabaseCacheBackend:\n def time_delete(self):\n for _ in range(100):\n self.cache.delete(self.random_key())\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
52+
"min_run_count": 2,
53+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_delete",
54+
"number": 0,
55+
"param_names": [],
56+
"params": [],
57+
"repeat": 0,
58+
"rounds": 2,
59+
"sample_time": 0.01,
60+
"timeout": 60.0,
61+
"type": "time",
62+
"unit": "seconds",
63+
"version": "07f0a8ee98f405b3c9cdacfa3fbd7d647457be48ca7714da8e56372d37e88fbc",
64+
"warmup_time": -1
65+
},
66+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_delete_many": {
67+
"code": "class DatabaseCacheBackend:\n def time_delete_many(self):\n for _ in range(100):\n self.cache.delete_many([self.random_key() for x in range(100)])\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
68+
"min_run_count": 2,
69+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_delete_many",
70+
"number": 0,
71+
"param_names": [],
72+
"params": [],
73+
"repeat": 0,
74+
"rounds": 2,
75+
"sample_time": 0.01,
76+
"timeout": 60.0,
77+
"type": "time",
78+
"unit": "seconds",
79+
"version": "a04f9fcb13aee07e2d95a68d20ac814d4065def9efef59c0472fd293ac63256f",
80+
"warmup_time": -1
81+
},
82+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_get": {
83+
"code": "class DatabaseCacheBackend:\n def time_get(self):\n for _ in range(100):\n self.cache.get(self.random_key())\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
84+
"min_run_count": 2,
85+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_get",
86+
"number": 0,
87+
"param_names": [],
88+
"params": [],
89+
"repeat": 0,
90+
"rounds": 2,
91+
"sample_time": 0.01,
92+
"timeout": 60.0,
93+
"type": "time",
94+
"unit": "seconds",
95+
"version": "52a8f75efff5681f972451f3e3af030e973d587ed7c15aaac9ceedd955958e9f",
96+
"warmup_time": -1
97+
},
98+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_get_many": {
99+
"code": "class DatabaseCacheBackend:\n def time_get_many(self):\n for _ in range(100):\n self.cache.get_many([self.random_key() for x in range(100)])\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
100+
"min_run_count": 2,
101+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_get_many",
102+
"number": 0,
103+
"param_names": [],
104+
"params": [],
105+
"repeat": 0,
106+
"rounds": 2,
107+
"sample_time": 0.01,
108+
"timeout": 60.0,
109+
"type": "time",
110+
"unit": "seconds",
111+
"version": "7dd0ec68c7105e52259b3898aeb8335e13e48b6b4fe72e7613b922b5378f156c",
112+
"warmup_time": -1
113+
},
114+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_incr": {
115+
"code": "class DatabaseCacheBackend:\n def time_incr(self):\n for _ in range(100):\n self.cache.incr(self.int_key)\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
116+
"min_run_count": 2,
117+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_incr",
118+
"number": 0,
119+
"param_names": [],
120+
"params": [],
121+
"repeat": 0,
122+
"rounds": 2,
123+
"sample_time": 0.01,
124+
"timeout": 60.0,
125+
"type": "time",
126+
"unit": "seconds",
127+
"version": "2528a8b9f20cd63f856f2433c945a86b1ed47d80067ed274d0658c82a294b55e",
128+
"warmup_time": -1
129+
},
130+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_set": {
131+
"code": "class DatabaseCacheBackend:\n def time_set(self):\n for _ in range(100):\n self.cache.set(self.random_key(), self.random_binary())\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
132+
"min_run_count": 2,
133+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_set",
134+
"number": 0,
135+
"param_names": [],
136+
"params": [],
137+
"repeat": 0,
138+
"rounds": 2,
139+
"sample_time": 0.01,
140+
"timeout": 60.0,
141+
"type": "time",
142+
"unit": "seconds",
143+
"version": "531e6b038e1a3c1d508e8384158bcd6a5a8f0fb4e0882f745d4c1857f9bc50aa",
144+
"warmup_time": -1
145+
},
146+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_set_many": {
147+
"code": "class DatabaseCacheBackend:\n def time_set_many(self):\n for _ in range(100):\n self.cache.set_many(\n {self.random_key(): self.random_binary() for x in range(100)}\n )\n\n def setup(self):\n bench_setup()\n call_command(\"createcachetable\", verbosity=0)\n random.seed(0)\n \n self.cache = caches[\"db\"]\n self.int_key = \"int_key\"\n self.cache.set(self.int_key, 0)",
148+
"min_run_count": 2,
149+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_set_many",
150+
"number": 0,
151+
"param_names": [],
152+
"params": [],
153+
"repeat": 0,
154+
"rounds": 2,
155+
"sample_time": 0.01,
156+
"timeout": 60.0,
157+
"type": "time",
158+
"unit": "seconds",
159+
"version": "0e00525996147e94dd7c38af71224e7f7cae740572cb1b9c1127cde1b9be5259",
160+
"warmup_time": -1
161+
},
2162
"data_struct_benchmarks.multi_value_dict.benchmark.MultiValueDictBench.time_multi_value_dict": {
3163
"code": "class MultiValueDictBench:\n def time_multi_value_dict(self):\n for i in range(1000):\n case_dict = MultiValueDict(self.case)\n \n case_dict[\"a\"]\n case_dict[\"b\"]\n case_dict[\"c\"]\n \n case_dict.update(self.update)\n copy.copy(case_dict)\n copy.deepcopy(case_dict)\n \n case_dict.items()\n case_dict.lists()\n for i in case_dict:\n i\n \n case_dict[\"a\"] = \"A\"\n case_dict[\"b\"] = \"B\"\n case_dict[\"c\"] = \"C\"\n\n def setup(self):\n bench_setup()\n self.case = {\"a\": [\"a\"], \"b\": [\"a\", \"b\"], \"c\": [\"a\", \"b\", \"c\"]}\n self.update = {\"a\": [\"a\"], \"b\": [\"a\", \"b\"], \"c\": [\"a\", \"b\", \"c\"]}",
4164
"min_run_count": 2,

0 commit comments

Comments
 (0)