mirror of
https://github.com/swc-project/swc.git
synced 2024-11-28 11:13:43 +03:00
feat(dbg-swc): Make reducer parallel (#4676)
This commit is contained in:
parent
0aa3d96757
commit
ba6688a783
64
Cargo.lock
generated
64
Cargo.lock
generated
@ -802,6 +802,7 @@ dependencies = [
|
|||||||
"swc_ecma_visit",
|
"swc_ecma_visit",
|
||||||
"swc_error_reporters",
|
"swc_error_reporters",
|
||||||
"swc_timer",
|
"swc_timer",
|
||||||
|
"tempdir",
|
||||||
"tracing",
|
"tracing",
|
||||||
"tracing-subscriber",
|
"tracing-subscriber",
|
||||||
"url",
|
"url",
|
||||||
@ -981,6 +982,12 @@ version = "1.2.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394"
|
checksum = "2022715d62ab30faffd124d40b76f4134a550a87792276512b18d63272333394"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fuchsia-cprng"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "futures-channel"
|
name = "futures-channel"
|
||||||
version = "0.3.19"
|
version = "0.3.19"
|
||||||
@ -2016,7 +2023,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
|
checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"phf_shared",
|
"phf_shared",
|
||||||
"rand",
|
"rand 0.8.4",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2241,6 +2248,19 @@ version = "1.0.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ce082a9940a7ace2ad4a8b7d0b1eac6aa378895f18be598230c5f2284ac05426"
|
checksum = "ce082a9940a7ace2ad4a8b7d0b1eac6aa378895f18be598230c5f2284ac05426"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand"
|
||||||
|
version = "0.4.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "552840b97013b1a26992c11eac34bdd778e464601a4c2054b5f0bff7c6761293"
|
||||||
|
dependencies = [
|
||||||
|
"fuchsia-cprng",
|
||||||
|
"libc",
|
||||||
|
"rand_core 0.3.1",
|
||||||
|
"rdrand",
|
||||||
|
"winapi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.8.4"
|
version = "0.8.4"
|
||||||
@ -2249,7 +2269,7 @@ checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"rand_chacha",
|
"rand_chacha",
|
||||||
"rand_core",
|
"rand_core 0.6.3",
|
||||||
"rand_hc",
|
"rand_hc",
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -2260,9 +2280,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ppv-lite86",
|
"ppv-lite86",
|
||||||
"rand_core",
|
"rand_core 0.6.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core 0.4.2",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rand_core"
|
||||||
|
version = "0.4.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand_core"
|
name = "rand_core"
|
||||||
version = "0.6.3"
|
version = "0.6.3"
|
||||||
@ -2278,7 +2313,7 @@ version = "0.3.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
|
checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand_core",
|
"rand_core 0.6.3",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2305,6 +2340,15 @@ dependencies = [
|
|||||||
"num_cpus",
|
"num_cpus",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "rdrand"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2"
|
||||||
|
dependencies = [
|
||||||
|
"rand_core 0.3.1",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "redox_syscall"
|
name = "redox_syscall"
|
||||||
version = "0.2.10"
|
version = "0.2.10"
|
||||||
@ -4139,6 +4183,16 @@ version = "0.12.2"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff"
|
checksum = "d9bffcddbc2458fa3e6058414599e3c838a022abae82e5c67b4f7f80298d5bff"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tempdir"
|
||||||
|
version = "0.3.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "15f2b5fb00ccdf689e0149d1b1b3c03fead81c2b37735d812fa8bddbbf41b6d8"
|
||||||
|
dependencies = [
|
||||||
|
"rand 0.4.6",
|
||||||
|
"remove_dir_all",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tempfile"
|
name = "tempfile"
|
||||||
version = "3.2.0"
|
version = "3.2.0"
|
||||||
@ -4147,7 +4201,7 @@ checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"cfg-if 1.0.0",
|
"cfg-if 1.0.0",
|
||||||
"libc",
|
"libc",
|
||||||
"rand",
|
"rand 0.8.4",
|
||||||
"redox_syscall",
|
"redox_syscall",
|
||||||
"remove_dir_all",
|
"remove_dir_all",
|
||||||
"winapi",
|
"winapi",
|
||||||
|
@ -28,6 +28,7 @@ swc_ecma_transforms_base = { version = "0.85.0", path = "../swc_ecma_transforms_
|
|||||||
swc_ecma_visit = { version = "0.64.0", path = "../swc_ecma_visit" }
|
swc_ecma_visit = { version = "0.64.0", path = "../swc_ecma_visit" }
|
||||||
swc_error_reporters = { version = "0.2.0", path = "../swc_error_reporters" }
|
swc_error_reporters = { version = "0.2.0", path = "../swc_error_reporters" }
|
||||||
swc_timer = { version = "0.6.0", path = "../swc_timer" }
|
swc_timer = { version = "0.6.0", path = "../swc_timer" }
|
||||||
|
tempdir = "0.3.7"
|
||||||
tracing = "0.1.34"
|
tracing = "0.1.34"
|
||||||
tracing-subscriber = { version = "0.3.11", features = ["fmt", "env-filter"] }
|
tracing-subscriber = { version = "0.3.11", features = ["fmt", "env-filter"] }
|
||||||
url = "2"
|
url = "2"
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
set -eu
|
set -eu
|
||||||
|
|
||||||
find .input -type f | xargs -L 1 -I {} cargo run --release -- minify reduce --mode size '{}' && rm '{}'
|
cargo run --release -- minify reduce --mode size --remove .input
|
||||||
# mv data/*.js ./.input/
|
# mv data/*.js ./.input/
|
@ -1,6 +1,6 @@
|
|||||||
#![feature(box_syntax)]
|
#![feature(box_syntax)]
|
||||||
|
|
||||||
use std::{env, str::FromStr, sync::Arc};
|
use std::{env, path::PathBuf, str::FromStr, sync::Arc};
|
||||||
|
|
||||||
use anyhow::{bail, Result};
|
use anyhow::{bail, Result};
|
||||||
use clap::{StructOpt, Subcommand};
|
use clap::{StructOpt, Subcommand};
|
||||||
@ -24,6 +24,10 @@ mod minify;
|
|||||||
mod test;
|
mod test;
|
||||||
mod util;
|
mod util;
|
||||||
|
|
||||||
|
const CREDUCE_INPUT_ENV_VAR: &str = "CREDUCE_INPUT";
|
||||||
|
|
||||||
|
const CREDUCE_MODE_ENV_VAR: &str = "CREDUCE_COMPARE";
|
||||||
|
|
||||||
#[derive(Debug, clap::Parser)]
|
#[derive(Debug, clap::Parser)]
|
||||||
struct AppArgs {
|
struct AppArgs {
|
||||||
#[clap(subcommand)]
|
#[clap(subcommand)]
|
||||||
@ -63,7 +67,7 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
let cm = Arc::new(SourceMap::default());
|
let cm = Arc::new(SourceMap::default());
|
||||||
|
|
||||||
if let Ok(mode) = env::var("CREDUCE_COMPARE") {
|
if let Ok(mode) = env::var(CREDUCE_MODE_ENV_VAR) {
|
||||||
return try_with_handler(
|
return try_with_handler(
|
||||||
cm.clone(),
|
cm.clone(),
|
||||||
HandlerOpts {
|
HandlerOpts {
|
||||||
@ -74,14 +78,18 @@ fn main() -> Result<()> {
|
|||||||
GLOBALS.set(&Globals::default(), || {
|
GLOBALS.set(&Globals::default(), || {
|
||||||
HANDLER.set(handler, || {
|
HANDLER.set(handler, || {
|
||||||
//
|
//
|
||||||
|
let input = PathBuf::from(
|
||||||
|
env::var(CREDUCE_INPUT_ENV_VAR)
|
||||||
|
.expect("creduce is invoked without the name of input file"),
|
||||||
|
);
|
||||||
|
|
||||||
if mode == "SIZE" {
|
if mode == "SIZE" {
|
||||||
let m = get_minified(cm.clone(), "input.js".as_ref(), true, true)?;
|
let m = get_minified(cm.clone(), &input, true, true)?;
|
||||||
|
|
||||||
let swc_output = print_js(cm.clone(), &m.module, true)?;
|
let swc_output = print_js(cm.clone(), &m.module, true)?;
|
||||||
|
|
||||||
let terser_output = get_terser_output("input.js".as_ref(), true, true)?;
|
let terser_output = get_terser_output(&input, true, true)?;
|
||||||
if swc_output.len() > terser_output.len() {
|
if swc_output.trim().len() > terser_output.trim().len() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -90,7 +98,7 @@ fn main() -> Result<()> {
|
|||||||
// We target es5, but esbuild does not support it
|
// We target es5, but esbuild does not support it
|
||||||
let swc_output = swc_output.replace("\\n", "_");
|
let swc_output = swc_output.replace("\\n", "_");
|
||||||
|
|
||||||
let esbuild_output = get_esbuild_output("input.js".as_ref(), true)?;
|
let esbuild_output = get_esbuild_output(&input, true)?;
|
||||||
|
|
||||||
if swc_output.len() > esbuild_output.len() {
|
if swc_output.len() > esbuild_output.len() {
|
||||||
return Ok(());
|
return Ok(());
|
||||||
@ -104,12 +112,11 @@ fn main() -> Result<()> {
|
|||||||
|
|
||||||
bail!("We don't care about this file")
|
bail!("We don't care about this file")
|
||||||
} else if mode == "SEMANTICS" {
|
} else if mode == "SEMANTICS" {
|
||||||
let m = get_minified(cm.clone(), "input.js".as_ref(), true, false)?;
|
let m = get_minified(cm.clone(), &input, true, false)?;
|
||||||
|
|
||||||
let swc_output = print_js(cm.clone(), &m.module, true)?;
|
let swc_output = print_js(cm.clone(), &m.module, true)?;
|
||||||
|
|
||||||
let terser_output =
|
let terser_output = get_terser_output(&input, true, false)?;
|
||||||
get_terser_output("input.js".as_ref(), true, false)?;
|
|
||||||
|
|
||||||
if swc_output.len() <= 1000 || terser_output.len() <= 1000 {
|
if swc_output.len() <= 1000 || terser_output.len() <= 1000 {
|
||||||
bail!("We don't care about this file because it's too small")
|
bail!("We don't care about this file because it's too small")
|
||||||
|
@ -8,8 +8,12 @@ use std::{
|
|||||||
|
|
||||||
use anyhow::{Context, Result};
|
use anyhow::{Context, Result};
|
||||||
use clap::{ArgEnum, Args};
|
use clap::{ArgEnum, Args};
|
||||||
|
use rayon::prelude::*;
|
||||||
use sha1::{Digest, Sha1};
|
use sha1::{Digest, Sha1};
|
||||||
use swc_common::SourceMap;
|
use swc_common::SourceMap;
|
||||||
|
use tempdir::TempDir;
|
||||||
|
|
||||||
|
use crate::{util::all_js_files, CREDUCE_INPUT_ENV_VAR, CREDUCE_MODE_ENV_VAR};
|
||||||
|
|
||||||
#[derive(Debug, Args)]
|
#[derive(Debug, Args)]
|
||||||
pub struct ReduceCommand {
|
pub struct ReduceCommand {
|
||||||
@ -17,6 +21,10 @@ pub struct ReduceCommand {
|
|||||||
|
|
||||||
#[clap(long, arg_enum)]
|
#[clap(long, arg_enum)]
|
||||||
pub mode: ReduceMode,
|
pub mode: ReduceMode,
|
||||||
|
|
||||||
|
/// If true, the input file will be removed after the reduction.
|
||||||
|
#[clap(long)]
|
||||||
|
pub remove: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy, ArgEnum)]
|
#[derive(Debug, Clone, Copy, ArgEnum)]
|
||||||
@ -27,24 +35,45 @@ pub enum ReduceMode {
|
|||||||
|
|
||||||
impl ReduceCommand {
|
impl ReduceCommand {
|
||||||
pub fn run(self, _cm: Arc<SourceMap>) -> Result<()> {
|
pub fn run(self, _cm: Arc<SourceMap>) -> Result<()> {
|
||||||
fs::copy(&self.path, "input.js").context("failed to copy")?;
|
let js_files = all_js_files(&self.path)?;
|
||||||
|
|
||||||
|
js_files
|
||||||
|
.into_par_iter()
|
||||||
|
.map(|path| self.reduce_file(&path))
|
||||||
|
.collect::<Result<Vec<_>>>()?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn reduce_file(&self, src_path: &Path) -> Result<()> {
|
||||||
|
let dir = TempDir::new("dbg-swc").context("failed to create a temp directory")?;
|
||||||
|
|
||||||
|
let input = dir.path().join("input.js");
|
||||||
|
|
||||||
|
fs::copy(&src_path, &input).context("failed to copy")?;
|
||||||
|
|
||||||
let mut c = Command::new("creduce");
|
let mut c = Command::new("creduce");
|
||||||
|
|
||||||
c.env(
|
c.env(
|
||||||
"CREDUCE_COMPARE",
|
CREDUCE_MODE_ENV_VAR,
|
||||||
match self.mode {
|
match self.mode {
|
||||||
ReduceMode::Size => "SIZE",
|
ReduceMode::Size => "SIZE",
|
||||||
ReduceMode::Semantics => "SEMANTICS",
|
ReduceMode::Semantics => "SEMANTICS",
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
c.env(CREDUCE_INPUT_ENV_VAR, &input);
|
||||||
|
|
||||||
let exe = current_exe()?;
|
let exe = current_exe()?;
|
||||||
c.arg(&exe);
|
c.arg(&exe);
|
||||||
c.arg("input.js");
|
c.arg(&input);
|
||||||
let status = c.status().context("failed to run creduce")?;
|
let status = c.status().context("failed to run creduce")?;
|
||||||
|
|
||||||
if status.success() {
|
if status.success() {
|
||||||
move_to_data_dir("input.js".as_ref())?;
|
move_to_data_dir(&input)?;
|
||||||
|
}
|
||||||
|
|
||||||
|
if self.remove {
|
||||||
|
fs::remove_file(&src_path).context("failed to remove")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -68,7 +97,7 @@ fn move_to_data_dir(input_path: &Path) -> Result<PathBuf> {
|
|||||||
create_dir_all(format!("data/{}", hash_str)).context("failed to create `.data`")?;
|
create_dir_all(format!("data/{}", hash_str)).context("failed to create `.data`")?;
|
||||||
|
|
||||||
let to = PathBuf::from(format!("data/{}/input.js", hash_str));
|
let to = PathBuf::from(format!("data/{}/input.js", hash_str));
|
||||||
fs::copy(input_path, &to).context("failed to copy")?;
|
fs::write(&to, src.as_bytes()).context("failed to write")?;
|
||||||
|
|
||||||
Ok(to)
|
Ok(to)
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
[]({
|
[]({
|
||||||
c() {
|
c() {
|
||||||
var a = {}.b;
|
a = {}.b;
|
||||||
},
|
},
|
||||||
});
|
});
|
Loading…
Reference in New Issue
Block a user