Skip to content

Commit 3ec7f40

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

File tree

5 files changed

+273
-0
lines changed

5 files changed

+273
-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,73 @@
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.add(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_get_or_set(self):
32+
for _ in range(100):
33+
self.cache.get_or_set(self.random_key(), self.random_binary())
34+
35+
def time_touch(self):
36+
for _ in range(100):
37+
self.cache.touch(self.random_key())
38+
39+
def time_delete(self):
40+
for _ in range(100):
41+
self.cache.delete(self.random_key())
42+
43+
def time_get_many(self):
44+
for _ in range(100):
45+
self.cache.get_many([self.random_key() for x in range(100)])
46+
47+
def time_set_many(self):
48+
for _ in range(100):
49+
self.cache.set_many(
50+
{self.random_key(): self.random_binary() for x in range(100)}
51+
)
52+
53+
def time_delete_many(self):
54+
for _ in range(100):
55+
self.cache.delete_many([self.random_key() for x in range(100)])
56+
57+
def time_clear(self):
58+
for _ in range(100):
59+
self.cache.clear()
60+
61+
def time_incr(self):
62+
for _ in range(100):
63+
self.cache.incr(self.int_key)
64+
65+
def time_decr(self):
66+
for _ in range(100):
67+
self.cache.decr(self.int_key)
68+
69+
def random_key(self):
70+
return "key_{}".format(random.randint(1, 500))
71+
72+
def random_binary(self):
73+
return random.randint(1, 1024**1) * random.randint(0, 255)

benchmarks/settings.py

+8
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99
"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"},
1010
}
1111

12+
CACHES = {
13+
"db": {
14+
"BACKEND": "django.core.cache.backends.db.DatabaseCache",
15+
"LOCATION": "cache_table",
16+
},
17+
}
18+
1219
INSTALLED_APPS = [
1320
"django.contrib.auth",
1421
"django.contrib.contenttypes",
@@ -54,6 +61,7 @@
5461
"benchmarks.query_benchmarks.query_select_related",
5562
"benchmarks.req_resp_benchmarks.default_middleware",
5663
"benchmarks.req_resp_benchmarks.http_methods",
64+
"benchmarks.cache_benchmarks.database_cache",
5765
]
5866

5967
SECRET_KEY = "NOT REALLY SECRET"

results/benchmarks.json

+192
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,196 @@
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.add(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": "068ce1f47f80990f0eeb45965d11260da8e178e70c678241a275c2eee908b680",
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.decr(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": "9c8dfd36603e0b69964f151c3ab330c5653af7069031b664d016925319e39eed",
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_get_or_set": {
115+
"code": "class DatabaseCacheBackend:\n def time_get_or_set(self):\n for _ in range(100):\n self.cache.get_or_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)",
116+
"min_run_count": 2,
117+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_get_or_set",
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": "e745c4556a6e6d8467ee9d92ffcdd35e46538fa3d3b7f41262fac3741ce408a0",
128+
"warmup_time": -1
129+
},
130+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_incr": {
131+
"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)",
132+
"min_run_count": 2,
133+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_incr",
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": "2528a8b9f20cd63f856f2433c945a86b1ed47d80067ed274d0658c82a294b55e",
144+
"warmup_time": -1
145+
},
146+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_set": {
147+
"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)",
148+
"min_run_count": 2,
149+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_set",
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": "531e6b038e1a3c1d508e8384158bcd6a5a8f0fb4e0882f745d4c1857f9bc50aa",
160+
"warmup_time": -1
161+
},
162+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_set_many": {
163+
"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)",
164+
"min_run_count": 2,
165+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_set_many",
166+
"number": 0,
167+
"param_names": [],
168+
"params": [],
169+
"repeat": 0,
170+
"rounds": 2,
171+
"sample_time": 0.01,
172+
"timeout": 60.0,
173+
"type": "time",
174+
"unit": "seconds",
175+
"version": "0e00525996147e94dd7c38af71224e7f7cae740572cb1b9c1127cde1b9be5259",
176+
"warmup_time": -1
177+
},
178+
"cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_touch": {
179+
"code": "class DatabaseCacheBackend:\n def time_touch(self):\n for _ in range(100):\n self.cache.touch(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)",
180+
"min_run_count": 2,
181+
"name": "cache_benchmarks.database_cache.benchmark.DatabaseCacheBackend.time_touch",
182+
"number": 0,
183+
"param_names": [],
184+
"params": [],
185+
"repeat": 0,
186+
"rounds": 2,
187+
"sample_time": 0.01,
188+
"timeout": 60.0,
189+
"type": "time",
190+
"unit": "seconds",
191+
"version": "1f38b4b59244617c19320bbf8226e74165bba613d89fb314cfec928a8b55dd96",
192+
"warmup_time": -1
193+
},
2194
"data_struct_benchmarks.multi_value_dict.benchmark.MultiValueDictBench.time_multi_value_dict": {
3195
"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\"]}",
4196
"min_run_count": 2,

0 commit comments

Comments
 (0)