Allow comparison

This commit is contained in:
Wilson Lin 2021-08-09 20:42:47 +10:00
parent b18201169f
commit 0bed19e5ed
13 changed files with 106 additions and 37 deletions

View File

@ -18,6 +18,6 @@ for r in *; do
done
popd >/dev/null
popd >/dev/null
echo "All done!"
popd >/dev/null

View File

@ -29,6 +29,6 @@ for r in *; do
done
popd >/dev/null
popd >/dev/null
echo "All done!"
popd >/dev/null

View File

@ -5,6 +5,7 @@ const path = require("path");
const iterations = parseInt(process.env.MHB_ITERATIONS, 10);
const inputDir = process.env.MHB_INPUT_DIR;
const htmlOnly = process.env.MHB_HTML_ONLY === "1";
const outputDir = process.env.MHB_OUTPUT_DIR;
const minifyHtmlCfg = minifyHtml.createConfiguration({
minify_css: !htmlOnly,
@ -13,12 +14,19 @@ const minifyHtmlCfg = minifyHtml.createConfiguration({
const results = fs.readdirSync(inputDir).map((name) => {
const src = fs.readFileSync(path.join(inputDir, name));
const out = minifyHtml.minify(src, minifyHtmlCfg);
const len = out.byteLength;
if (outputDir) {
fs.writeFileSync(path.join(outputDir, name), out);
}
const start = process.hrtime.bigint();
let len;
for (let i = 0; i < iterations; i++) {
len = minifyHtml.minify(src, minifyHtmlCfg).byteLength;
minifyHtml.minify(src, minifyHtmlCfg);
}
const elapsed = process.hrtime.bigint() - start;
return [name, len, iterations, Number(elapsed) / 1_000_000_000];
});
console.log(JSON.stringify(results));

View File

@ -5,5 +5,6 @@
- `MHB_ITERATIONS`: times to run each input.
- `MHB_INPUT_DIR`: path to directory containing inputs. Files should be read from this directory and used as the inputs.
- `MHB_HTML_ONLY`: if set to `1`, `minify_css` and `minify_js` should be disabled.
- The output should be a JSON array of tuples, where each tuples contains the input name, output size, iterations, and execution time in seconds (as a floating point value).
- `MHB_OUTPUT_DIR`: if set, output minified HTML for each input in this folder.
- The output should be a JSON array of tuples, where each tuples contains the input name, output UTF-8 byte length, iterations, and execution time in seconds (as a floating point value).
- The execution time should be measured using high-precision monotonic system clocks where possible.

View File

@ -6,6 +6,7 @@ const path = require("path");
const iterations = parseInt(process.env.MHB_ITERATIONS, 10);
const inputDir = process.env.MHB_INPUT_DIR;
const htmlOnly = process.env.MHB_HTML_ONLY === "1";
const outputDir = process.env.MHB_OUTPUT_DIR;
const esbuildCss = (code) =>
esbuild.transformSync(code, {
@ -47,12 +48,19 @@ const htmlMinifierCfg = {
const results = fs.readdirSync(inputDir).map((name) => {
const src = fs.readFileSync(path.join(inputDir, name), "utf8");
const out = htmlMinifier.minify(src, htmlMinifierCfg);
const len = Buffer.from(out, "utf8").length;
if (outputDir) {
fs.writeFileSync(path.join(outputDir, name), out);
}
const start = process.hrtime.bigint();
let len;
for (let i = 0; i < iterations; i++) {
len = htmlMinifier.minify(src, htmlMinifierCfg).length;
htmlMinifier.minify(src, htmlMinifierCfg);
}
const elapsed = process.hrtime.bigint() - start;
return [name, len, iterations, Number(elapsed) / 1_000_000_000];
});
console.log(JSON.stringify(results));

View File

@ -14,8 +14,7 @@ fn main() {
.ok()
.filter(|v| v == "1")
.is_some();
let tests = fs::read_dir(input_dir).unwrap().map(|d| d.unwrap());
let output_dir = env::var("MHB_OUTPUT_DIR").ok();
let mut results: Vec<(String, usize, usize, f64)> = Vec::new();
let cfg = Cfg {
@ -23,21 +22,25 @@ fn main() {
minify_js: !html_only,
};
for t in tests {
for t in fs::read_dir(input_dir).unwrap().map(|d| d.unwrap()) {
let source = fs::read(t.path()).unwrap();
let input_name = t.file_name().into_string().unwrap();
let mut output = source.to_vec();
let len = in_place(&mut output, &cfg).expect("failed to minify");
output.truncate(len);
if let Some(output_dir) = &output_dir {
fs::write(format!("{}/{}", output_dir, input_name), output).unwrap();
};
let start = Instant::now();
let mut len = 0;
for _ in 0..iterations {
let mut data = source.to_vec();
len = in_place(&mut data, &cfg).expect("failed to minify");
let _ = in_place(&mut data, &cfg).expect("failed to minify");
}
let elapsed = start.elapsed().as_secs_f64();
results.push((
t.file_name().into_string().unwrap(),
len,
iterations,
elapsed,
));
results.push((input_name, len, iterations, elapsed));
}
serde_json::to_writer(stdout(), &results).unwrap();

View File

@ -14,8 +14,7 @@ fn main() {
.ok()
.filter(|v| v == "1")
.is_some();
let tests = fs::read_dir(input_dir).unwrap().map(|d| d.unwrap());
let output_dir = env::var("MHB_OUTPUT_DIR").ok();
let mut results: Vec<(String, usize, usize, f64)> = Vec::new();
let mut cfg = Cfg::new();
@ -24,20 +23,23 @@ fn main() {
cfg.minify_js = true;
};
for t in tests {
for t in fs::read_dir(input_dir).unwrap().map(|d| d.unwrap()) {
let source = fs::read(t.path()).unwrap();
let input_name = t.file_name().into_string().unwrap();
let output = minify(&source, &cfg);
let len = output.len();
if let Some(output_dir) = &output_dir {
fs::write(format!("{}/{}", output_dir, input_name), output).unwrap();
};
let start = Instant::now();
let mut len = 0;
for _ in 0..iterations {
len = minify(&source, &cfg).len();
let _ = minify(&source, &cfg);
}
let elapsed = start.elapsed().as_secs_f64();
results.push((
t.file_name().into_string().unwrap(),
len,
iterations,
elapsed,
));
results.push((input_name, len, iterations, elapsed));
}
serde_json::to_writer(stdout(), &results).unwrap();

View File

@ -6,6 +6,7 @@ const path = require("path");
const iterations = parseInt(process.env.MHB_ITERATIONS, 10);
const inputDir = process.env.MHB_INPUT_DIR;
const htmlOnly = process.env.MHB_HTML_ONLY === "1";
const outputDir = process.env.MHB_OUTPUT_DIR;
const jsMime = new Set([
undefined,
@ -58,14 +59,23 @@ const jsCssPlugin = {
const plugins = htmlOnly ? [] : [jsCssPlugin];
const minifier = new minimize({ plugins });
const results = fs.readdirSync(inputDir).map((name) => {
const src = fs.readFileSync(path.join(inputDir, name), "utf8");
const out = minifier.parse(src);
const len = Buffer.from(out, "utf8").length;
if (outputDir) {
fs.writeFileSync(path.join(outputDir, name), out);
}
const start = process.hrtime.bigint();
let len;
for (let i = 0; i < iterations; i++) {
len = new minimize({ plugins }).parse(src).length;
minifier.parse(src);
}
const elapsed = process.hrtime.bigint() - start;
return [name, len, iterations, Number(elapsed) / 1_000_000_000];
});
console.log(JSON.stringify(results));

1
debug/diff/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/outputs/

View File

@ -1 +1 @@
[compare.sh](./compare.sh) is a useful script for viewing a character-by-character diff between the minified outputs of minify-html and html-minifier for a specific test. Pass the test's file name as the first argument.
[compare](./compare) is a useful script for viewing a character-by-character diff between the minified outputs of minify-html and html-minifier for a specific input. Pass the input's file name as the first argument.

9
debug/diff/compare Executable file
View File

@ -0,0 +1,9 @@
#!/usr/bin/env bash
set -Eeuxo pipefail
pushd "$(dirname "$0")" >/dev/null
git --no-pager diff --no-index --word-diff=color --word-diff-regex=. "outputs/html-minifier/$1" "outputs/minify-html/$1" | less
popd >/dev/null

View File

@ -1,3 +0,0 @@
#!/usr/bin/env bash
git --no-pager diff --no-index --word-diff=color --word-diff-regex=. "min/html-minifier/$1.html" "min/@minify-html/js/$1.html" | less

30
debug/diff/run Executable file
View File

@ -0,0 +1,30 @@
#!/usr/bin/env bash
set -Eeuo pipefail
shopt -s nullglob
pushd "$(dirname "$0")" >/dev/null
input_dir="$PWD/../../bench/inputs"
output_dir="$PWD/outputs"
rm -rf "$output_dir"
mkdir -p "$output_dir"
pushd "../../bench/runners" >/dev/null
for r in *; do
if [ ! -d "$r" ]; then
continue
fi
mkdir -p "$output_dir/$r"
echo "Running $r..."
pushd "$r" >/dev/null
MHB_ITERATIONS=1 MHB_INPUT_DIR="$input_dir" MHB_OUTPUT_DIR="$output_dir/$r" RUST_BACKTRACE=1 ./run >/dev/null
popd >/dev/null
done
popd >/dev/null
echo "All done!"
popd >/dev/null