使用`@()`的glob是否比大括号展开更高效?
glob表达式中
@()与大括号{}的性能差异 两者的性能差异核心在于执行逻辑的本质不同:
- 大括号
{j,t}属于shell的预展开语法,它会先把原表达式拆成两个独立的glob:./**/*.?(m|c)js和./**/*.?(m|c)ts,然后分别执行两次完整的glob匹配流程——意味着会遍历两次目标目录(包括所有子目录),对每个文件做两次匹配检查。 @(j|t)是glob语法本身的分支匹配规则,属于单个glob表达式的一部分,只会触发一次目录遍历,在遍历过程中对每个文件名直接完成分支条件的匹配,不需要重复遍历数据集。
针对你给出的两个例子:
./**/*.?(m|c){j,t}s会执行两次递归遍历,耗时基本是另一个版本的两倍(文件越多,差异越明显)。./**/*.?(m|c)@(j|t)s只需要一次遍历,每个文件仅做一次匹配检查,性能更优。
你的推测完全正确——@()确实不会多次遍历数据集,在大多数场景下都是更高效的选择,尤其是处理包含大量文件的目录时,性能提升会非常显著。
内容的提问来源于stack exchange,提问作者roydukkey
相关产品推荐
相关产品推荐

