From 57a34bb989ab18fc5ba1f740aad06c84064933db Mon Sep 17 00:00:00 2001 From: Julien Castiaux Date: Fri, 4 Jun 2021 11:59:15 +0000 Subject: [PATCH] [IMP] base: fields_view_get() benchmark MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A test that calls fields_view_get() on all models while measuring its performances. Use it along with py-spy and load the generated file in py-spy record -F -r 200 --format speedscope -o speedscope.json -- \ python3 odoo-bin -d --test-tags render_all_views --stop-after-init Task: 2463632 Co-authored-by: Raphaƫl Collet --- odoo/addons/base/tests/test_views.py | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/odoo/addons/base/tests/test_views.py b/odoo/addons/base/tests/test_views.py index 000c609498e..17e93c674dc 100644 --- a/odoo/addons/base/tests/test_views.py +++ b/odoo/addons/base/tests/test_views.py @@ -1,9 +1,10 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. import ast +import logging +import time from functools import partial -import logging from lxml import etree from lxml.builder import E @@ -3042,3 +3043,26 @@ class TestAllViews(common.TransactionCase): _logger.info('checked %s/%s views', index, len(views)) with self.subTest(name=view.name): view._check_xml() + +@common.tagged('post_install', '-at_install', '-standard', 'render_all_views') +class TestRenderAllViews(common.TransactionCase): + + @common.users('demo', 'admin') + def test_render_all_views(self): + env = self.env(context={'lang': 'en_US'}) + count = 0 + elapsed = 0 + for model in env.values(): + if not model._abstract and model.check_access_rights('read', False): + with self.subTest(model=model): + times = [] + for _ in range(5): + model.invalidate_cache() + before = time.perf_counter() + model.fields_view_get() + times.append(time.perf_counter() - before) + count += 1 + elapsed += min(times) + + _logger.info('Rendered %d views as %s using (best of 5) %ss', + count, self.env.user.name, elapsed)