code-moniker-core 0.2.0

Core symbol-graph types and per-language extractors for code-moniker (pure Rust, no pgrx). Consumed by the CLI and the PostgreSQL extension.
Documentation
use std::time::Instant;

use code_moniker_core::core::moniker::MonikerBuilder;
use code_moniker_core::lang::ts;

const ITERS: usize = 50;

fn main() {
	let path = std::env::args().nth(1).unwrap_or_else(|| {
		"/Users/alexandreboyer/dev/projects/pg_code_moniker/dogfood/ts/zod/src/types.ts".to_string()
	});
	let src = std::fs::read_to_string(&path).expect("read");
	let anchor = MonikerBuilder::new().project(b".").build();
	let presets = ts::Presets::default();

	let mut parse_ns = 0u128;
	let mut extract_ns = 0u128;
	let mut total_ns = 0u128;

	for _ in 0..ITERS {
		let t_total = Instant::now();

		let t = Instant::now();
		let _tree = ts::parse(&src);
		parse_ns += t.elapsed().as_nanos();

		let t = Instant::now();
		let _g = ts::extract(&path, &src, &anchor, true, &presets);
		extract_ns += t.elapsed().as_nanos();

		total_ns += t_total.elapsed().as_nanos();
	}

	let total_ms = total_ns as f64 / 1_000_000.0;
	let parse_ms = parse_ns as f64 / 1_000_000.0;
	let extract_ms = extract_ns as f64 / 1_000_000.0;
	println!("file:        {} ({} bytes)", path, src.len());
	println!("iterations:  {}", ITERS);
	println!("--- per-run averages ---");
	println!("parse-only:  {:.2} ms", parse_ms / ITERS as f64);
	println!("full extract:{:.2} ms", extract_ms / ITERS as f64);
	println!(
		"walk+emit:   {:.2} ms (extract - parse)",
		(extract_ms - parse_ms) / ITERS as f64
	);
	println!("--- totals (both phases run each iter) ---");
	println!("total wall:  {:.2} ms", total_ms / ITERS as f64);
	println!();
	let parse_share = (parse_ms / extract_ms) * 100.0;
	let walk_share = ((extract_ms - parse_ms) / extract_ms) * 100.0;
	println!("Parse share of extract: {:.1}%", parse_share);
	println!("Walk+emit share:        {:.1}%", walk_share);
}