2025-02-05 18:41:31 +01:00
|
|
|
import timeit
|
|
|
|
from pathlib import Path
|
|
|
|
|
|
|
|
from fastapi.templating import Jinja2Templates
|
|
|
|
from jinja2 import Environment, FileSystemLoader
|
2025-02-05 18:42:39 +01:00
|
|
|
|
2025-02-05 18:41:31 +01:00
|
|
|
from jinjax import Catalog
|
|
|
|
|
|
|
|
|
|
|
|
here = Path(__file__).parent
|
|
|
|
number = 10_000
|
|
|
|
|
|
|
|
catalog = Catalog()
|
|
|
|
catalog.add_folder(here)
|
|
|
|
|
|
|
|
env = Environment(loader=FileSystemLoader(here))
|
|
|
|
|
|
|
|
templates = Jinja2Templates(directory=here)
|
|
|
|
|
|
|
|
|
|
|
|
def render_jinjax_simple():
|
|
|
|
"""simple case"""
|
|
|
|
catalog.render("Simple", message="Hey there")
|
|
|
|
|
|
|
|
|
|
|
|
def render_jinjax_real():
|
|
|
|
"""realistic case"""
|
|
|
|
catalog.render("Real", message="Hey there")
|
|
|
|
|
|
|
|
|
|
|
|
def render_jinja():
|
|
|
|
env.get_template("hello.html").render(message="Hey there")
|
|
|
|
|
|
|
|
|
|
|
|
def render_fastapi():
|
|
|
|
templates.TemplateResponse("hello.html", {"request": None, "message": "Hey there"})
|
|
|
|
|
|
|
|
|
|
|
|
def benchmark_no_cache(func):
|
|
|
|
print(f"NO CACHE: {number:_} renders of {func.__doc__}...\n")
|
|
|
|
catalog.use_cache = False
|
|
|
|
benchmark(func)
|
|
|
|
|
|
|
|
|
|
|
|
def benchmark_auto_reload(func):
|
|
|
|
print(f"CACHE, AUTO-RELOAD: {number:_} renders of {func.__doc__}...\n")
|
|
|
|
catalog.use_cache = True
|
|
|
|
catalog.auto_reload = True
|
|
|
|
benchmark(func)
|
|
|
|
|
|
|
|
|
|
|
|
def benchmark_no_auto_reload(func):
|
|
|
|
print(f"CACHE, NO AUTO-RELOAD: {number:_} renders of {func.__doc__}...\n")
|
|
|
|
catalog.use_cache = True
|
|
|
|
catalog.auto_reload = False
|
|
|
|
benchmark(func)
|
|
|
|
|
|
|
|
|
|
|
|
def benchmark(func):
|
|
|
|
time_jinjax = timeit.timeit(func, number=number)
|
|
|
|
print_line("JinjaX", time_jinjax)
|
|
|
|
print(f"{time_jinjax / time_jinja:.1f} times Jinja")
|
|
|
|
print(f"{time_jinjax / time_fastapi:.1f} times FastApi")
|
|
|
|
|
|
|
|
|
|
|
|
def print_line(name, time):
|
|
|
|
print(f"{name}: {(time / number):.12f}s per render ({(1_000_000 * time / number):.0f}µs), {time:.1f}s total")
|
|
|
|
|
|
|
|
|
|
|
|
def print_separator():
|
|
|
|
print()
|
|
|
|
print("-" * 60)
|
|
|
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
2025-02-05 18:42:39 +01:00
|
|
|
print("Benchmarking...\n")
|
2025-02-05 18:41:31 +01:00
|
|
|
time_jinja = timeit.timeit(render_jinja, number=number)
|
|
|
|
time_fastapi = timeit.timeit(render_fastapi, number=number)
|
|
|
|
|
|
|
|
print_line("Jinja", time_jinja)
|
|
|
|
print_line("FastApi", time_fastapi)
|
|
|
|
print_separator()
|
|
|
|
benchmark_no_cache(render_jinjax_simple)
|
|
|
|
print_separator()
|
|
|
|
benchmark_auto_reload(render_jinjax_simple)
|
|
|
|
print_separator()
|
|
|
|
benchmark_no_auto_reload(render_jinjax_simple)
|
|
|
|
print_separator()
|
|
|
|
benchmark_no_cache(render_jinjax_real)
|
|
|
|
print_separator()
|
|
|
|
benchmark_auto_reload(render_jinjax_real)
|
|
|
|
print_separator()
|
|
|
|
benchmark_no_auto_reload(render_jinjax_real)
|
|
|
|
print()
|