Performance
Dinja is designed for high performance with several optimization strategies.
Renderer Reuse
The most important performance tip: reuse Renderer instances.
# Good: Create once, reuse many times
renderer = Renderer()
for mdx_file in many_files:
result = renderer.render(...)
# Bad: Creating new renderer for each render
for mdx_file in many_files:
renderer = Renderer() # Expensive!
result = renderer.render(...)
Batch Rendering
Render multiple files in a single batch call:
# Good: Single batch call
result = renderer.render(
Input(
mdx={
"file1.mdx": "...",
"file2.mdx": "...",
"file3.mdx": "...",
},
settings=Settings(output="html"),
)
)
# Less efficient: Multiple calls
for file in files:
result = renderer.render(
Input(mdx={file: content}, ...)
)
Minification
Enable minification for production:
Retry Configuration
For high-load scenarios, adjust retry settings:
renderer = Renderer(
max_retries=3, # Default is usually sufficient
retry_delay=0.05, # Minimal delay
backoff_factor=1.5 # Moderate backoff
)
Rust Performance
The Rust API provides the best performance:
// Single service instance for all renders
let service = RenderService::new(config)?;
// Batch rendering
let outcome = service.render_batch(&input)?;
Benchmarks
Dinja's Rust core provides: - 2-5x faster than creating new service instances for each render - Native performance without Node.js overhead - Efficient memory usage with renderer pooling
Best Practices
- ✅ Reuse Renderer instances
- ✅ Use batch rendering for multiple files
- ✅ Enable minification in production
- ✅ Use Rust API for maximum performance
- ❌ Don't create new Renderer for each render
- ❌ Don't render files one-by-one when batching is possible