@body
@countmodule main
import os
import strings
import time
import x.templating.dtm2
const bench_root_name = 'dtm2_benchmark'
struct BenchConfig {
case_name string
iterations int
cold_iterations int
placeholder_count int
compress_html bool
reload_modified_templates bool
validate_each_iteration bool
}
fn main() {
config := BenchConfig{
case_name: os.getenv('DTM2_BENCH_CASE')
iterations: env_int('DTM2_BENCH_ITERATIONS', 50000)
cold_iterations: env_int('DTM2_BENCH_COLD_ITERATIONS', 500)
placeholder_count: env_int('DTM2_BENCH_PLACEHOLDERS', 50)
compress_html: env_bool('DTM2_BENCH_COMPRESS_HTML', true)
reload_modified_templates: env_bool('DTM2_BENCH_RELOAD_MODIFIED_TEMPLATES', false)
validate_each_iteration: env_bool('DTM2_BENCH_VALIDATE_EACH_ITERATION', false)
}
root := os.join_path(os.vtmp_dir(), '${bench_root_name}_${os.getpid()}')
os.rmdir_all(root) or {}
setup_files(root, config)!
defer {
os.rmdir_all(root) or {}
}
print_config(root, config)
small := small_placeholders()
many := many_placeholders(config.placeholder_count)
include := include_placeholders()
if should_run(config, 'small_hot') {
bench_hot('small_hot', root, 'small.html', small, config.iterations, config)
}
if should_run(config, 'small_cold') {
bench_cold('small_cold', root, 'small.html', small, config.cold_iterations, config)
}
if should_run(config, 'many_hot') {
bench_hot('many_hot', root, 'many.html', many, config.iterations, config)
}
if should_run(config, 'many_cold') {
bench_cold('many_cold', root, 'many.html', many, config.cold_iterations, config)
}
if should_run(config, 'include_hot') {
bench_hot('include_hot', root, 'with_include.html', include, config.iterations, config)
}
if should_run(config, 'include_cold') {
bench_cold('include_cold', root, 'with_include.html', include, config.cold_iterations,
config)
}
if should_run(config, 'xml_hot') {
bench_hot('xml_hot', root, 'feed.xml', small, config.iterations, config)
}
if should_run(config, 'xml_cold') {
bench_cold('xml_cold', root, 'feed.xml', small, config.cold_iterations, config)
}
}
fn print_config(root string, config BenchConfig) {
println('DTM2 benchmark')
println('root: ${root}')
println('case_name: ${if config.case_name == '' { 'all' } else { config.case_name }}')
println('iterations: ${config.iterations}')
println('cold_iterations: ${config.cold_iterations}')
println('placeholder_count: ${config.placeholder_count}')
println('compress_html: ${config.compress_html}')
println('reload_modified_templates: ${config.reload_modified_templates}')
println('validate_each_iteration: ${config.validate_each_iteration}')
println('')
}
fn env_int(name string, default_value int) int {
raw := os.getenv(name)
if raw == '' {
return default_value
}
value := raw.int()
if value <= 0 {
return default_value
}
return value
}
fn env_bool(name string, default_value bool) bool {
raw := os.getenv(name).to_lower()
if raw == '' {
return default_value
}
if raw in ['1', 'true', 'yes', 'on'] {
return true
}
if raw in ['0', 'false', 'no', 'off'] {
return false
}
return default_value
}
fn should_run(config BenchConfig, label string) bool {
return config.case_name == '' || config.case_name == 'all' || config.case_name == label
}
fn setup_files(root string, config BenchConfig) ! {
os.mkdir_all(os.join_path(root, 'partials'))!
os.write_file(os.join_path(root, 'small.html'),
' @body