#wc #count #word-count #word #line-count #read-input

bin+lib cw

计数单词,一个快速的 wc 克隆

7 个版本 (破坏性)

0.7.0 2019 年 7 月 2 日
0.6.0 2019 年 3 月 13 日
0.5.0 2019 年 1 月 18 日
0.4.0 2019 年 1 月 13 日
0.1.0 2019 年 1 月 7 日

#1157 in 文本处理

每月 48 次下载

MIT 许可证

29KB
677

cw - Count Words

A fast wc clone in Rust.

概要

-% cw --help
cw 0.5.0
Thomas Hurst <tom@hur.st>
Count Words - word, line, character and byte count

USAGE:
    cw [FLAGS] [OPTIONS] [input]...

FLAGS:
    -c, --bytes              Count bytes
    -m, --chars              Count UTF-8 characters instead of bytes
    -h, --help               Prints help information
    -l, --lines              Count lines
    -L, --max-line-length    Count bytes (default) or characters (-m) of the longest line
    -V, --version            Prints version information
    -w, --words              Count words

OPTIONS:
        --files0-from <files0_from>    Read input from the NUL-terminated list of filenames in the given file.
        --files-from <files_from>      Read input from the newline-terminated list of filenames in the given file.
        --threads <threads>            Number of counting threads to spawn [default: 1]

ARGS:
    <input>...    Input files

-% cw Dickens_Charles_Pickwick_Papers.xml
 3449440 51715840 341152640 Dickens_Charles_Pickwick_Papers.xml

性能

使用 --threads 选项可以加速多个文件的计数

  'xargs <files cw --threads=12' ran
    2.01 ± 0.03 times faster than 'xargs <files cw --threads=4'
    7.07 ± 0.09 times faster than 'xargs <files cw'
   11.55 ± 0.15 times faster than 'xargs <files wc'
   17.31 ± 0.23 times faster than 'xargs <files gwc'

使用 bytecount 包优化行数

  'cw -l Dickens_Charles_Pickwick_Papers.xml' ran
    3.44 ± 0.04 times faster than 'wc -l Dickens_Charles_Pickwick_Papers.xml'
    4.17 ± 0.05 times faster than 'gwc -l Dickens_Charles_Pickwick_Papers.xml'

使用 memchr 包优化带行长的行数

  'cw -lL Dickens_Charles_Pickwick_Papers.xml' ran
    1.73 ± 0.01 times faster than 'wc -lL Dickens_Charles_Pickwick_Papers.xml'
   15.07 ± 0.07 times faster than 'gwc -lL Dickens_Charles_Pickwick_Papers.xml'

注意,没有 -m 时,cw 只操作字节,并且它从不关心你的区域设置。

  'cw Dickens_Charles_Pickwick_Papers.xml' ran
    1.45 ± 0.01 times faster than 'wc Dickens_Charles_Pickwick_Papers.xml'
    2.05 ± 0.00 times faster than 'gwc Dickens_Charles_Pickwick_Papers.xml'

-m 启用 UTF-8 处理,对于仅字符长度,使用 bytecount 的快速路径

  'cw -m Dickens_Charles_Pickwick_Papers.xml' ran
   30.21 ± 0.39 times faster than 'gwc -m Dickens_Charles_Pickwick_Papers.xml'
   70.36 ± 0.91 times faster than 'wc -m Dickens_Charles_Pickwick_Papers.xml'
  'cw -m test-utf-8.html' ran
   84.74 ± 1.12 times faster than 'wc -m test-utf-8.html'
  124.21 ± 1.64 times faster than 'gwc -m test-utf-8.html'

还有另一个路径用于字符和行长度

  'cw -mlL Dickens_Charles_Pickwick_Papers.xml' ran
    3.88 ± 0.01 times faster than 'gwc -mlL Dickens_Charles_Pickwick_Papers.xml'
    9.05 ± 0.02 times faster than 'wc -mlL Dickens_Charles_Pickwick_Papers.xml'
  'cw -mlL test-utf-8.html' ran
    9.42 ± 0.01 times faster than 'wc -mlL test-utf-8.html'
   18.95 ± 0.03 times faster than 'gwc -mlL test-utf-8.html'

还有一个慢速路径用于其他所有内容

  'cw -mLlw Dickens_Charles_Pickwick_Papers.xml' ran
    1.35 ± 0.00 times faster than 'gwc -mLlw Dickens_Charles_Pickwick_Papers.xml'
    3.15 ± 0.00 times faster than 'wc -mLlw Dickens_Charles_Pickwick_Papers.xml'

这些测试是在 FreeBSD 12 上进行的,处理器为 2.1GHz Westmere Xeon。 gwc 来自 GNU coreutils 8.30 - 注意,由于 FreeBSD 的 memchr 实现相当弱,在某些区域对性能的评估相当悲观。YMMV。

为了获得最佳结果,请使用以下命令进行构建

cargo build --release --features runtime-dispatch-simd

This enables SIMD optimizations for line and character counting. It has no effect if you count anything else.

未来

  • 测试套件。
  • 将内部结构提取到库中。 (#1)
  • 改善多字节支持。
  • 可能实现区域设置。
  • 用更轻量级的工具替换 clap/structopt。

另请参阅

uwc

uwc focuses on following Unicode rules as precisely as possible, taking into account less-common newlines, counting graphemes as well as codepoints, and following Unicode word-boundary rules precisely.

这的代价是目前性能相当低,我的基准文件计数超过了一分钟。

rwc

cw 最初被称为 rwc,直到我发现这个存在。它相当古老,看起来无法编译。

linecount

一个小型库,只执行纯换行符计数,以及一个名为 lc 的二进制文件。版本 0.2 将使用与 cw 相同的算法。

依赖关系

~4.5MB
~81K SLoC