模板编译一次要几毫秒,所以 Jinja 会缓存。缓存在哪里、多大、什么时候失效?改了模板为什么有时不生效?这篇把缓存的每个开关都打开关上试一遍。
get_template("t0.html") 3 次:加载器的 get_source 调用了 1 次;缓存里有 1 项;缓存键示例: ["(<weakref at 0x10aad5490; to 'Counting' at 0x10aa2e270>, 't0"]
默认 auto_reload = True → 每次 get_template 都会检查文件是否被修改(uptodate)上一篇:模板渲染异常处理;下一篇:Jinja2 Bytecode Cache。编译与渲染的耗时见Jinja2 Template Loader。
auto_reload=True 缓存命中的 get_template:1.74 µs/次 auto_reload=False 缓存命中的 get_template:0.32 µs/次
auto_reload=True 改前 '版本 1' → 改后 '版本 2' auto_reload=False 改前 '版本 1' → 改后 '版本 1'
cache_size=400 10 轮 × 3 个模板 = 30 次 get_template,加载器读文件 3 次 cache_size=2 10 轮 × 3 个模板 = 30 次 get_template,加载器读文件 30 次 cache_size=400 轮流取 3 个模板:0.002 ms/轮 cache_size=2 轮流取 3 个模板:1.407 ms/轮
cache_size=0:get_template 5 次,读文件 5 次 cache.clear() 之后再取:读文件 2 次(共 2 次:清之前 1 次 + 清之后 1 次)
DEBUG=False TEMPLATES_AUTO_RELOAD=None → jinja_env.auto_reload = False DEBUG=True TEMPLATES_AUTO_RELOAD=None → jinja_env.auto_reload = True DEBUG=False TEMPLATES_AUTO_RELOAD=True → jinja_env.auto_reload = True DEBUG=True TEMPLATES_AUTO_RELOAD=False → jinja_env.auto_reload = False 先设 app.debug = False(这会创建 jinja_env),再设 TEMPLATES_AUTO_RELOAD = True → jinja_env.auto_reload = False (配置必须在 jinja_env 创建之前设好)
第一次请求(含编译)1523 µs;之后每次 85 µs;第一次是之后的 18 倍