Skip to content

Commit af9732b

Browse files
perf(template): avoid schema cloning and add fast path for plain templates
Skip cloning merged schema during Template construction by deferring initialization to init_render when needed. Add fast path in render() for templates without blocks to avoid unnecessary schema operations for plain text content.
1 parent 537c39f commit af9732b

File tree

1 file changed

+12
-1
lines changed

1 file changed

+12
-1
lines changed

src/template.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,9 @@ impl<'a> Template<'a> {
7777
let mut default_schema = default_schema_template()?;
7878

7979
update_schema_owned(&mut default_schema, schema);
80-
let shared = Shared::new(default_schema.clone());
80+
// Avoid cloning a potentially huge merged schema during construction.
81+
// `shared` will be fully initialized in `init_render` when needed.
82+
let shared = Shared::new(default_schema_template()?);
8183

8284
Ok(Template {
8385
raw,
@@ -286,6 +288,15 @@ impl<'a> Template<'a> {
286288
///
287289
/// The rendered template content as a string.
288290
pub fn render(&mut self) -> String {
291+
// Fast path: when there are no blocks, skip full render initialization.
292+
// This avoids cloning large schemas for templates with plain text/empty source.
293+
self.time_start = Instant::now();
294+
if !self.raw.contains(BIF_OPEN) {
295+
self.out = self.raw.trim().to_string();
296+
self.time_elapsed = self.time_start.elapsed();
297+
return self.out.clone();
298+
}
299+
289300
let inherit = self.init_render();
290301
self.out = BlockParser::new(&mut self.shared, inherit.clone()).parse(&self.raw, "");
291302

0 commit comments

Comments
 (0)