Add some benchmarks for LruCache (#6446)

pull/7219/head
Amber Brown 2020-04-04 02:31:52 +11:00 committed by GitHub
parent 07b88c546d
commit 334bfdbc90
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 91 additions and 5 deletions

1
changelog.d/6446.misc Normal file
View File

@ -0,0 +1 @@
Add benchmarks for LruCache.

View File

@ -14,6 +14,7 @@
# limitations under the License. # limitations under the License.
import sys import sys
from argparse import REMAINDER
from contextlib import redirect_stderr from contextlib import redirect_stderr
from io import StringIO from io import StringIO
@ -21,7 +22,7 @@ import pyperf
from synmark import make_reactor from synmark import make_reactor
from synmark.suites import SUITES from synmark.suites import SUITES
from twisted.internet.defer import ensureDeferred from twisted.internet.defer import Deferred, ensureDeferred
from twisted.logger import globalLogBeginner, textFileLogObserver from twisted.logger import globalLogBeginner, textFileLogObserver
from twisted.python.failure import Failure from twisted.python.failure import Failure
@ -40,7 +41,8 @@ def make_test(main):
file_out = StringIO() file_out = StringIO()
with redirect_stderr(file_out): with redirect_stderr(file_out):
d = ensureDeferred(main(reactor, loops)) d = Deferred()
d.addCallback(lambda _: ensureDeferred(main(reactor, loops)))
def on_done(_): def on_done(_):
if isinstance(_, Failure): if isinstance(_, Failure):
@ -50,6 +52,7 @@ def make_test(main):
return _ return _
d.addBoth(on_done) d.addBoth(on_done)
reactor.callWhenRunning(lambda: d.callback(True))
reactor.run() reactor.run()
return d.result return d.result
@ -62,11 +65,13 @@ if __name__ == "__main__":
def add_cmdline_args(cmd, args): def add_cmdline_args(cmd, args):
if args.log: if args.log:
cmd.extend(["--log"]) cmd.extend(["--log"])
cmd.extend(args.tests)
runner = pyperf.Runner( runner = pyperf.Runner(
processes=3, min_time=2, show_name=True, add_cmdline_args=add_cmdline_args processes=3, min_time=1.5, show_name=True, add_cmdline_args=add_cmdline_args
) )
runner.argparser.add_argument("--log", action="store_true") runner.argparser.add_argument("--log", action="store_true")
runner.argparser.add_argument("tests", nargs=REMAINDER)
runner.parse_args() runner.parse_args()
orig_loops = runner.args.loops orig_loops = runner.args.loops
@ -79,6 +84,11 @@ if __name__ == "__main__":
) )
setupdb() setupdb()
if runner.args.tests:
SUITES = list(
filter(lambda x: x[0].__name__.split(".")[-1] in runner.args.tests, SUITES)
)
for suite, loops in SUITES: for suite, loops in SUITES:
if loops: if loops:
runner.args.loops = loops runner.args.loops = loops

View File

@ -1,3 +1,9 @@
from . import logging from . import logging, lrucache, lrucache_evict
SUITES = [(logging, 1000), (logging, 10000), (logging, None)] SUITES = [
(logging, 1000),
(logging, 10000),
(logging, None),
(lrucache, None),
(lrucache_evict, None),
]

View File

@ -0,0 +1,34 @@
# -*- coding: utf-8 -*-
# Copyright 2019 The Matrix.org Foundation C.I.C.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from pyperf import perf_counter
from synapse.util.caches.lrucache import LruCache
async def main(reactor, loops):
"""
Benchmark `loops` number of insertions into LruCache without eviction.
"""
cache = LruCache(loops)
start = perf_counter()
for i in range(loops):
cache[i] = True
end = perf_counter() - start
return end

View File

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Copyright 2019 The Matrix.org Foundation C.I.C.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from pyperf import perf_counter
from synapse.util.caches.lrucache import LruCache
async def main(reactor, loops):
"""
Benchmark `loops` number of insertions into LruCache where half of them are
evicted.
"""
cache = LruCache(loops // 2)
start = perf_counter()
for i in range(loops):
cache[i] = True
end = perf_counter() - start
return end