为什么 sed 这么快?

Ale*_*lex 8 performance sed files

我想过这个问题是否适合SE,希望你同意。

前段时间我在 SE 上询问如何在文件中查找文本,并只留下包含我正在搜索的文本的匹配行。问题在这里: 如何在文件中查找文本并仅使用 OS X 上的终端保留相应的匹配行?

虽然答案完美无缺,但我现在想知道,为什么sed这么快?在我的用例中,我有很多文件,总大小约为 30 Gb。该sed命令在大约 12 秒内运行,这是我永远不会相信的(使用普通硬盘驱动器)。在 12 秒内,该命令读取了 30 Gb 的文本,截断每个文件以仅保留我正在过滤的相应行。这是如何运作的?(或:这是什么魔法?)

实际命令是:

find . -type f -exec sed -i'' '/\B\/foobar\b/!d' {} \;
Run Code Online (Sandbox Code Playgroud)

sup*_*esk 3

可能的答案是:

  1. 30Gb 文件没有碎片(或碎片很少):所有硬盘驱动器在顺序访问(包括 SSD)方面都表现得更好,因为它们能够缓存大块文件。这使他们能够达到最佳表现。顺序访问将有助于各级缓存。
  2. sed是一个流编辑器;它一次只处理一行。这意味着它的内存占用很小。与emacs或等文本编辑器不同vim,它不需要在内存中维护文件的整个副本。
  3. 您正在就地编辑文件(使用-i),该文件(如@Ramesh 所示以及维基百科页面上所述)创建一个临时文件,然后该文件将成为旧文件。

所有这些意味着sed能够执行几乎最少的文件操作:原始文件的每一行都被读取一次,并且只写入匹配的行。

您对正则表达式的选择也会影响性能,有时甚至会以非常糟糕的方式影响性能。:编码恐怖博客