我该如何估计我的gzipped脚本的大小?

93

我如何在 JavaScript 文件被压缩后估算其大小?是否有在线工具可用?或者这类似于使用 WinZip 等软件吗?

9个回答

134

如果你使用的是Unix系统 - gzip -c filename.min.js | wc -c 命令可以给出压缩后文件的字节数。


5
gzip可以通过Cygwin或UnxUtils在Windows上使用。 - Mauricio Scheffer
4
谢谢。通过执行gunzip -c myfile | wc -czcat myfile | wc -c,可以知道未压缩的原始字节数大小。 - Adrien Schuler
2
获取未压缩文件的大小:cat filename.js | wc -c - Jess Telford

56

http://closure-compiler.appspot.com/home让你可以粘贴代码,并且它会在 GZIP 前后为你提供特定文件的压缩比率。

Original Size:    90 bytes (100 bytes gzipped)
Compiled Size:    55 bytes (68 bytes gzipped)
Saved 38.89% off the original size (32.00% off the gzipped size)
您可以使用pretty-print(漂亮打印)和white-space only(仅空格)选项来估计非压缩内容的压缩情况。
如果您需要一个估计值:
- 从已经通过相同的压缩流程的100个JS文件开始。 - 对于每个文件,计算gzip -c "$f" | wc -cwc -c "$f"之间大小比率的平均值。 - 这些比率的平均值是您应该期望在类似JS文件中获得的压缩近似值。 Cygwin 包含了Windows命令行下的gzipwc 实现。

谢谢!我会尝试使用Cygwin,但现在闭包编译器已经给了我需要的答案。 - Christophe

16

直接从终端执行

gzip -9 -c path/to/file.js | wc -c | numfmt --to=iec-i --suffix=B --padding=10

如果需要进行比较,请使用原始尺寸。
cat path/to/file.js | wc -c | numfmt --to=iec-i --suffix=B --padding=10

要以编程方式获取它,可以使用像gzip-size这样的实用工具。它是一个Node软件包,但您可以将其全局安装为通用工具。

9

7-zip支持压缩到GZIP格式。

我经常用这个来近似比较文件大小。

当创建存档时,查找Archive Formatgzip是第三个选项。

更新:

在评论中,我们讨论了7-zip的GZIP压缩和实际服务器的GZIP压缩之间可能存在差异。因此,我只使用http://www.google.com/的主页进行了比较。
Google的GZIP负载为36,678字节。 "gzip Normal"设置的7-zip为35,559(小3%)。 "gzip Fastest"设置为37,673(大3%)。

简而言之:7-zip的结果准确率约为97%


1
抱歉,7-zip 可以制作比大多数 CLI GZIP 打包程序更小的归档文件。如果您想要最小的文件,则非常好,但如果您想要精确的字节计数,以适应大多数 Web 服务器将即时生成的情况(我假设这是预期的场景?)则不太合适。 - tomByrer
@tomByrer 感谢提供的信息... 你能提供一些相关文档来支持吗?7-zip有很多gzip选项,也许其中一些可以配置以匹配CLI GZIP。 - Scott Rippey
这是我现在能够谷歌到的最好的测试。一周前,我进行了一个小的gzip比较,比较了gzip、7zip和zopfli;我需要添加更多的测试和格式化,这将需要时间。与此同时,为什么不提供这样的测试来证明你的观点呢? :) - tomByrer
由Jyrki Alakuijala博士和Lode Vandevenne硕士(Google公司)撰写的《使用Zopfli进行数据压缩》(https://zopfli.googlecode.com/files/Data_compression_using_Zopfli.pdf)进行了测试,比较了`gzip ­97­zip ­mm=Deflate ­mx=9`。在不同程度上,7zip始终更小。如果变化范围更小,我会推荐它(我自己是7-zip的粉丝)。 - tomByrer
1
好的,我更新了我的答案并进行了快速测试。我测试了google.com,并发现7-zip要小3%。对于大多数人来说,这应该是可以接受的。 - Scott Rippey
显示剩余2条评论

7

4

使用Node核心,您可以使用zlib.gzip缓冲区的长度来确定gzip大小:

const fs = require('fs');
const util = require('util');
const zlib = require('zlib');
const readFile = util.promisify(fs.readFile);
const gzip = util.promisify(zlib.gzip);

const getGzipSize = filePath => readFile(filePath)
  .then(gzip)
  .then(x => x.length);

谢谢,这正是我所寻找的,可以与github脚本操作一起使用。此外还有可用的同步API: const gzipSizeInKb = Math.round((zlib.gzipSync(content).length / 1024) * 100) / 100; - Dr. Lemon Tea

2

如果您想比较整个文件夹中未压缩、gzip压缩和brotli压缩后的文件大小(假设您想筛选*.js文件),请按以下步骤操作:

for file in *.js; do printf "$file\t$(cat $file | wc -c)\t$(gzip -kc7 $file | wc -c)\t$(brotli --in $file --out temp.br --force --quality 11 && cat temp.br | wc -c)\n"; done | tee filesizes.log

样例输出(使用制表符分隔,以便您可以将其复制到电子表格中):
foo.js 39035   10150   8982
bar.js 217000  68978   56337

1
删除了不必要的临时文件使用,并取消将输出保存到 filesizes.log。添加逗号以提高可读性。将gzip压缩级别提升至9,以匹配已经达到最大值的brotli压缩级别11。for file in *.js; do printf "$file\t$(cat $file | wc -c | xargs printf "%'d\n")\t$(gzip -9c $file | wc -c | xargs printf "%'d\n")\t$(brotli -cZ $file | wc -c | xargs printf "%'d\n")\n"; done | tee - mrienstra

0

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接