Skip to content

Commit f035d8a

Browse files
committed
perf(es): Use phf instead of lazy json
1 parent 9868b4d commit f035d8a

File tree

5 files changed

+101
-10
lines changed

5 files changed

+101
-10
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,8 @@ resolver = "2"
137137
wasmer = { version = "6.0.0", default-features = false }
138138
wasmer-wasix = { version = "0.600.0", default-features = false }
139139
wide = "0.7.32"
140+
precomputed-map = "0.1"
141+
xxhash-rust = "0.8"
140142

141143
[profile.release]
142144
lto = true

xtask/Cargo.toml

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ version = "0.1.0"
1111
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
1212

1313
[dependencies]
14-
anyhow = { workspace = true }
15-
cargo_metadata = { workspace = true }
16-
chrono = { workspace = true }
17-
clap = { version = "4.4.6", features = ["derive"] }
18-
semver = { workspace = true }
19-
serde = { workspace = true }
20-
serde_derive = { workspace = true }
21-
serde_json = { workspace = true }
22-
toml = { workspace = true }
23-
walkdir = { workspace = true }
14+
anyhow = { workspace = true }
15+
cargo_metadata = { workspace = true }
16+
chrono = { workspace = true }
17+
clap = { version = "4.4.6", features = ["derive"] }
18+
semver = { workspace = true }
19+
serde = { workspace = true }
20+
serde_derive = { workspace = true }
21+
serde_json = { workspace = true }
22+
toml = { workspace = true }
23+
walkdir = { workspace = true }
24+
precomputed-map = { workspace = true, features = [ "builder" ] }
25+
xxhash-rust = { workspace = true, features = [ "xxh3" ] }

xtask/src/es/codegen.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
use std::fs;
2+
use std::io::Write;
3+
use std::path::Path;
4+
use clap::Args;
5+
use anyhow::Context;
6+
7+
#[derive(Debug, Args)]
8+
pub(super) struct CodegenCmd {}
9+
10+
impl CodegenCmd {
11+
pub fn run(self) -> anyhow::Result<()> {
12+
let dir = Path::new(env!("CARGO_MANIFEST_DIR"));
13+
let dir = dir.parent().unwrap();
14+
15+
es_minifier_js_environment_props(dir)
16+
}
17+
}
18+
19+
fn es_minifier_js_environment_props(dir: &Path) -> anyhow::Result<()> {
20+
let crate_dir = dir.join("crates/swc_ecma_minifier/");
21+
22+
let domprops = fs::read_to_string(crate_dir.join("src/lists/domprops.json"))?;
23+
let jsprops = fs::read_to_string(crate_dir.join("src/lists/jsprops.json"))?;
24+
25+
let props = {
26+
let mut domprops: Vec<&str> = serde_json::from_str(&domprops)
27+
.context("failed to parse domprops.json for property mangler")?;
28+
let mut jsprops: Vec<&str> = serde_json::from_str(&jsprops)
29+
.context("Failed to parse jsprops.json for property mangler")?;
30+
domprops.append(&mut jsprops);
31+
domprops.sort_unstable();
32+
domprops.dedup();
33+
domprops
34+
};
35+
36+
let mapout = precomputed_map::builder::MapBuilder::new(&props)
37+
.set_ord(&|&x, &y| x.cmp(&y))
38+
.set_hash(&|seed, &v| {
39+
use std::hash::{ Hash, Hasher };
40+
41+
let mut hasher = xxhash_rust::xxh3::Xxh3::with_seed(seed);
42+
v.hash(&mut hasher);
43+
hasher.finish()
44+
})
45+
.set_next_seed(|seed, c| {
46+
dbg!(c);
47+
xxhash_rust::xxh3::xxh3_64_with_seed(&c.to_le_bytes(), seed)
48+
})
49+
.build()?;
50+
let mut builder = precomputed_map::builder::CodeBuilder::new(
51+
"props".into(),
52+
"SwcXxh3".into(),
53+
crate_dir.join("src/generated")
54+
);
55+
56+
let _ = fs::create_dir(crate_dir.join("src/generated"));
57+
58+
let k = builder.create_str_seq("PROPS_KEYS".into(), mapout.reorder(&props))?;
59+
mapout.create_map("PROPS".into(), k, &mut builder)?;
60+
61+
let mut codeout = fs::File::create(crate_dir.join("src/generated/props.rs"))?;
62+
builder.write_to(&mut codeout)?;
63+
64+
writeln!(codeout,
65+
r#"
66+
use crate::util::SwcXxh3;
67+
68+
pub fn is_exist(name: &str) -> bool {{
69+
PROPS.get(name).is_some()
70+
}}
71+
"#
72+
)?;
73+
74+
Ok(())
75+
}

xtask/src/es/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,10 @@ use anyhow::Result;
22
use clap::{Args, Subcommand};
33

44
use self::minifier::MinifierCmd;
5+
use self::codegen::CodegenCmd;
56

67
mod minifier;
8+
mod codegen;
79

810
/// Commands for ECMAScript crates.
911
#[derive(Debug, Args)]
@@ -16,11 +18,13 @@ impl EsCmd {
1618
pub fn run(self) -> Result<()> {
1719
match self.cmd {
1820
Cmd::Minifier(cmd) => cmd.run(),
21+
Cmd::Codegen(cmd) => cmd.run(),
1922
}
2023
}
2124
}
2225

2326
#[derive(Debug, Subcommand)]
2427
enum Cmd {
2528
Minifier(MinifierCmd),
29+
Codegen(CodegenCmd),
2630
}

0 commit comments

Comments
 (0)