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 次下载
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