Skip to content

Commit 5a9ff85

Browse files
committed
feat: update dependencies and add Tree-Sitter PHP benchmarks
1 parent ad80855 commit 5a9ff85

File tree

5 files changed

+126
-4
lines changed

5 files changed

+126
-4
lines changed

Cargo.lock

Lines changed: 43 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ edition = "2024"
55
authors = ["Di Wu <hi@wudi.io>"]
66
description = "A fast PHP parser written in Rust"
77
license = "MIT"
8+
exclude = ["tools/*", "tests/*", "bin/*"]
89

910
[dependencies]
1011
bumpalo = { version = "3.19.0", features = ["collections"] }
@@ -13,6 +14,8 @@ serde_json = "1.0.145"
1314
rayon = "1.10.0"
1415
pprof = { version = "0.15.0", features = ["flamegraph", "protobuf", "protobuf-codec"] }
1516
memchr = "2.7.6"
17+
tree-sitter = "0.25.10"
18+
tree-sitter-php = "0.24.2"
1619

1720
[dev-dependencies]
1821
insta = "1.44.2"

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ Table comparing with [nikic/PHP-Parser](https://github.com/nikic/PHP-Parser) v5.
7272
| Parser | Language | Time (ms) |
7373
|-------------------|----------------|------------------|
7474
| nikic/PHP-Parser | PHP | 33 |
75+
| tree-sitter-php | C | 15 |
7576
| php-parser | Rust | 0.67 |
7677

7778
> Machine specs: Apple M1 Pro, 32GB RAM

src/bin/bench_tree_sitter.rs

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
use std::env;
2+
use std::fs;
3+
use std::time::Instant;
4+
use tree_sitter::Parser;
5+
6+
fn main() {
7+
let args: Vec<String> = env::args().collect();
8+
if args.len() < 2 {
9+
eprintln!("Usage: {} <file>", args[0]);
10+
std::process::exit(1);
11+
}
12+
13+
let path = &args[1];
14+
let code = fs::read_to_string(path).expect("Failed to read file");
15+
let bytes = code.as_bytes();
16+
17+
println!("Benchmarking Tree-Sitter PHP: {}", path);
18+
println!("File size: {:.2} KB", bytes.len() as f64 / 1024.0);
19+
20+
let language = tree_sitter_php::LANGUAGE_PHP;
21+
22+
// Warmup
23+
println!("Warming up...");
24+
for _ in 0..50 {
25+
let mut parser = Parser::new();
26+
parser
27+
.set_language(&language.into())
28+
.expect("Error loading PHP grammar");
29+
let _ = parser.parse(&code, None).unwrap();
30+
}
31+
32+
// Benchmark
33+
let iterations = 200;
34+
println!("Running {} iterations...", iterations);
35+
36+
let start = Instant::now();
37+
38+
for _ in 0..iterations {
39+
let mut parser = Parser::new();
40+
parser
41+
.set_language(&language.into())
42+
.expect("Error loading PHP grammar");
43+
let _ = parser.parse(&code, None).unwrap();
44+
}
45+
46+
let duration = start.elapsed();
47+
let avg_time = duration / iterations as u32;
48+
let throughput =
49+
(bytes.len() as f64 * iterations as f64) / duration.as_secs_f64() / 1_024.0 / 1_024.0;
50+
51+
println!("Total time: {:?}", duration);
52+
println!("Average time: {:?}", avg_time);
53+
println!("Throughput: {:.2} MB/s", throughput);
54+
}

src/bin/tree_sitter_parse.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
use std::env;
2+
use std::fs;
3+
use tree_sitter::{Parser, Language};
4+
5+
fn main() {
6+
let args: Vec<String> = env::args().collect();
7+
if args.len() < 2 {
8+
eprintln!("Usage: {} <file>", args[0]);
9+
std::process::exit(1);
10+
}
11+
12+
let path = &args[1];
13+
let code = fs::read_to_string(path).expect("Failed to read file");
14+
15+
let mut parser = Parser::new();
16+
let language = tree_sitter_php::LANGUAGE_PHP;
17+
parser
18+
.set_language(&language.into())
19+
.expect("Error loading PHP grammar");
20+
21+
let tree = parser.parse(&code, None).unwrap();
22+
let root_node = tree.root_node();
23+
24+
println!("{}", root_node.to_sexp());
25+
}

0 commit comments

Comments
 (0)