#![allow(deprecated)]
use criterion::{BatchSize, BenchmarkId, Criterion, criterion_group, criterion_main};
use sqry_core::plugin::{LanguagePlugin, PluginManager};
use std::hint::black_box;
use tree_sitter::Parser;
fn bench_empty_manager(c: &mut Criterion) {
c.bench_function("plugin_manager_empty", |b| {
b.iter(|| {
let manager = black_box(PluginManager::new());
black_box(manager)
});
});
}
fn bench_single_plugin_registration(c: &mut Criterion) {
c.bench_function("plugin_register_single_rust", |b| {
b.iter(|| {
let mut manager = black_box(PluginManager::new());
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
black_box(manager)
});
});
}
fn bench_individual_plugins(c: &mut Criterion) {
let mut group = c.benchmark_group("plugin_register_individual");
group.bench_function("go", |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(sqry_lang_go::GoPlugin::default())));
black_box(manager)
});
});
group.bench_function("java", |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(sqry_lang_java::JavaPlugin::default())));
black_box(manager)
});
});
group.bench_function("javascript", |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(
sqry_lang_javascript::JavaScriptPlugin::default(),
)));
black_box(manager)
});
});
group.bench_function("python", |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(
sqry_lang_python::PythonPlugin::default(),
)));
black_box(manager)
});
});
group.bench_function("rust", |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
black_box(manager)
});
});
group.bench_function("swift", |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(sqry_lang_swift::SwiftPlugin::default())));
black_box(manager)
});
});
group.bench_function("typescript", |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(
sqry_lang_typescript::TypeScriptPlugin::default(),
)));
black_box(manager)
});
});
group.finish();
}
fn bench_upfront_loading_all_plugins(c: &mut Criterion) {
c.bench_function("plugin_load_all_13_upfront", |b| {
b.iter(|| {
let mut manager = black_box(PluginManager::new());
manager.register_builtin(black_box(Box::new(sqry_lang_go::GoPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_java::JavaPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_javascript::JavaScriptPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(
sqry_lang_python::PythonPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_swift::SwiftPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_typescript::TypeScriptPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(
sqry_lang_kotlin::KotlinPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(sqry_lang_lua::LuaPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_php::PhpPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_r::RPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_ruby::RubyPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_scala::ScalaPlugin::default())));
black_box(manager)
});
});
}
fn bench_incremental_loading(c: &mut Criterion) {
let mut group = c.benchmark_group("plugin_load_incremental");
group.bench_function(BenchmarkId::from_parameter("1_plugin"), |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
black_box(manager)
});
});
group.bench_function(BenchmarkId::from_parameter("3_plugins"), |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_javascript::JavaScriptPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(
sqry_lang_python::PythonPlugin::default(),
)));
black_box(manager)
});
});
group.bench_function(BenchmarkId::from_parameter("7_plugins_tier1"), |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(sqry_lang_go::GoPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_java::JavaPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_javascript::JavaScriptPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(
sqry_lang_python::PythonPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_swift::SwiftPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_typescript::TypeScriptPlugin::default(),
)));
black_box(manager)
});
});
group.bench_function(BenchmarkId::from_parameter("13_plugins_all"), |b| {
b.iter(|| {
let mut manager = PluginManager::new();
manager.register_builtin(black_box(Box::new(sqry_lang_go::GoPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_java::JavaPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_javascript::JavaScriptPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(
sqry_lang_python::PythonPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_swift::SwiftPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_typescript::TypeScriptPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(
sqry_lang_kotlin::KotlinPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(sqry_lang_lua::LuaPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_php::PhpPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_r::RPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_ruby::RubyPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_scala::ScalaPlugin::default())));
black_box(manager)
});
});
group.finish();
}
fn bench_cold_start_single_plugin(c: &mut Criterion) {
const SAMPLE_CODE: &[u8] = b"fn main() { println!(\"Hello\"); }";
c.bench_function("cold_start_single_rust", |b| {
b.iter(|| {
let mut manager = black_box(PluginManager::new());
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
let plugin = manager.plugin_for_extension("rs").unwrap();
let mut parser = black_box(Parser::new());
let language = black_box(plugin.language());
parser.set_language(&language).unwrap();
let tree = parser.parse(SAMPLE_CODE, None);
black_box((manager, tree))
});
});
}
fn bench_cold_start_individual_plugins(c: &mut Criterion) {
let mut group = c.benchmark_group("cold_start_individual");
group.bench_function("go", |b| {
const GO_CODE: &[u8] = b"package main\nfunc main() {}";
b.iter(|| {
let plugin = sqry_lang_go::GoPlugin::default();
let mut parser = Parser::new();
let language = plugin.language();
parser.set_language(&language).unwrap();
let tree = parser.parse(GO_CODE, None);
black_box(tree)
});
});
group.bench_function("java", |b| {
const JAVA_CODE: &[u8] = b"class Main { public static void main(String[] args) {} }";
b.iter(|| {
let plugin = sqry_lang_java::JavaPlugin::default();
let mut parser = Parser::new();
let language = plugin.language();
parser.set_language(&language).unwrap();
let tree = parser.parse(JAVA_CODE, None);
black_box(tree)
});
});
group.bench_function("javascript", |b| {
const JS_CODE: &[u8] = b"function main() { console.log('hello'); }";
b.iter(|| {
let plugin = sqry_lang_javascript::JavaScriptPlugin::default();
let mut parser = Parser::new();
let language = plugin.language();
parser.set_language(&language).unwrap();
let tree = parser.parse(JS_CODE, None);
black_box(tree)
});
});
group.bench_function("python", |b| {
const PY_CODE: &[u8] = b"def main():\n print('hello')";
b.iter(|| {
let plugin = sqry_lang_python::PythonPlugin::default();
let mut parser = Parser::new();
let language = plugin.language();
parser.set_language(&language).unwrap();
let tree = parser.parse(PY_CODE, None);
black_box(tree)
});
});
group.bench_function("rust", |b| {
const RUST_CODE: &[u8] = b"fn main() { println!(\"hello\"); }";
b.iter(|| {
let plugin = sqry_lang_rust::RustPlugin::default();
let mut parser = Parser::new();
let language = plugin.language();
parser.set_language(&language).unwrap();
let tree = parser.parse(RUST_CODE, None);
black_box(tree)
});
});
group.bench_function("swift", |b| {
const SWIFT_CODE: &[u8] = b"func main() { print(\"hello\") }";
b.iter(|| {
let plugin = sqry_lang_swift::SwiftPlugin::default();
let mut parser = Parser::new();
let language = plugin.language();
parser.set_language(&language).unwrap();
let tree = parser.parse(SWIFT_CODE, None);
black_box(tree)
});
});
group.bench_function("typescript", |b| {
const TS_CODE: &[u8] = b"function main(): void { console.log('hello'); }";
b.iter(|| {
let plugin = sqry_lang_typescript::TypeScriptPlugin::default();
let mut parser = Parser::new();
let language = plugin.language();
parser.set_language(&language).unwrap();
let tree = parser.parse(TS_CODE, None);
black_box(tree)
});
});
group.finish();
}
fn bench_cold_start_all_13_plugins(c: &mut Criterion) {
let samples: Vec<(&str, &[u8])> = vec![
("go", b"package main\nfunc main() {}"),
(
"java",
b"class Main { public static void main(String[] args) {} }",
),
("js", b"function main() { console.log('hello'); }"),
("py", b"def main():\n print('hello')"),
("rs", b"fn main() { println!(\"hello\"); }"),
("swift", b"func main() { print(\"hello\") }"),
("ts", b"function main(): void { console.log('hello'); }"),
("kt", b"fun main() { println(\"hello\") }"),
("lua", b"function main() print('hello') end"),
("php", b"<?php function main() { echo 'hello'; } ?>"),
("r", b"main <- function() { print('hello') }"),
("rb", b"def main\n puts 'hello'\nend"),
(
"scala",
b"object Main { def main(args: Array[String]): Unit = println(\"hello\") }",
),
];
c.bench_function("cold_start_all_13", |b| {
b.iter(|| {
let mut manager = black_box(PluginManager::new());
manager.register_builtin(black_box(Box::new(sqry_lang_go::GoPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_java::JavaPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_javascript::JavaScriptPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(
sqry_lang_python::PythonPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(sqry_lang_rust::RustPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_swift::SwiftPlugin::default())));
manager.register_builtin(black_box(Box::new(
sqry_lang_typescript::TypeScriptPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(
sqry_lang_kotlin::KotlinPlugin::default(),
)));
manager.register_builtin(black_box(Box::new(sqry_lang_lua::LuaPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_php::PhpPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_r::RPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_ruby::RubyPlugin::default())));
manager.register_builtin(black_box(Box::new(sqry_lang_scala::ScalaPlugin::default())));
for (ext, code) in black_box(&samples) {
if let Some(plugin) = manager.plugin_for_extension(ext) {
let mut parser = Parser::new();
let language = plugin.language();
parser.set_language(&language).unwrap();
let _ = parser.parse(code, None);
}
}
black_box(manager)
});
});
}
fn bench_plugin_lookup(c: &mut Criterion) {
let mut group = c.benchmark_group("plugin_lookup");
group.bench_function("lookup_1_plugin", |b| {
b.iter_batched(
|| {
let mut manager = PluginManager::new();
manager.register_builtin(Box::new(sqry_lang_rust::RustPlugin::default()));
manager
},
|manager| {
let result = manager.plugin_for_extension("rs").is_some();
black_box(result)
},
BatchSize::SmallInput,
);
});
group.bench_function("lookup_7_plugins", |b| {
b.iter_batched(
|| {
let mut manager = PluginManager::new();
manager.register_builtin(Box::new(sqry_lang_go::GoPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_java::JavaPlugin::default()));
manager
.register_builtin(Box::new(sqry_lang_javascript::JavaScriptPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_python::PythonPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_rust::RustPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_swift::SwiftPlugin::default()));
manager
.register_builtin(Box::new(sqry_lang_typescript::TypeScriptPlugin::default()));
manager
},
|manager| {
let result = manager.plugin_for_extension("rs").is_some();
black_box(result)
},
BatchSize::SmallInput,
);
});
group.bench_function("lookup_13_plugins", |b| {
b.iter_batched(
|| {
let mut manager = PluginManager::new();
manager.register_builtin(Box::new(sqry_lang_go::GoPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_java::JavaPlugin::default()));
manager
.register_builtin(Box::new(sqry_lang_javascript::JavaScriptPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_python::PythonPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_rust::RustPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_swift::SwiftPlugin::default()));
manager
.register_builtin(Box::new(sqry_lang_typescript::TypeScriptPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_kotlin::KotlinPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_lua::LuaPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_php::PhpPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_r::RPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_ruby::RubyPlugin::default()));
manager.register_builtin(Box::new(sqry_lang_scala::ScalaPlugin::default()));
manager
},
|manager| {
let result = manager.plugin_for_extension("rs").is_some();
black_box(result)
},
BatchSize::SmallInput,
);
});
group.finish();
}
criterion_group!(
benches,
bench_empty_manager,
bench_single_plugin_registration,
bench_individual_plugins,
bench_upfront_loading_all_plugins,
bench_incremental_loading,
bench_plugin_lookup,
bench_cold_start_single_plugin,
bench_cold_start_individual_plugins,
bench_cold_start_all_13_plugins,
);
criterion_main!(benches);