3 个版本

0.1.2 2019 年 10 月 11 日
0.1.1 2019 年 10 月 11 日
0.1.0 2019 年 10 月 11 日

#2347命令行工具

MIT 许可证

11KB
130

wc-rs

用 Rust 重新编写的经典 Unix 工具。

为什么用 Rust 来编写?

我想学习 Rust,这似乎是一个足够小且简单的项目来开始。令我惊讶的是,这个简单的实现比原始的 C 实现 wc 快,看看一些 数字。这是我第一个 Rust 项目,所以它可能包含一些不好的代码,如果发现有改进空间,请提出问题。

安装

  • 使用 cargo run 下载和安装 cargo install wc-rs
  • 从源码构建
      git clone https://github.com/palash25/wc-rs.git
      cd wc-rs/
      cargo build --release
    

用法

与每个 Linux 发行版中提供的标准 wc 命令相同。

$ wc-rs --help

USAGE:
    wc-rs [FLAGS] [FILE]...

FLAGS:
    -m, --chars      prints the character counts
    -h, --help       Prints help information
    -l, --lines      prints the newline counts
    -V, --version    Prints version information
    -w, --words      print the words counts

ARGS:
    <FILE>...    file path(s) to run wc-rs on

统计数据

使用 3 个文件进行测试,每个文件有 48K 行

时间测试

$ \time  wc-rs small-file-*
 48414   81402  556859 small-file-1
 48414   81402  556859 small-file-2
 48414   81402  556859 small-file-3
 145242  244206 1670577 total

 real 0:00.05	 user 0.05	 sys 0.00


$ \time  ./target/release/wc-rs small-file-*
 48414	81402	556859	small-file-1
 48414	81402	556859	small-file-2
 48414	81402	556859	small-file-3
 145242	244206	1670577	total

 real 0:00.02	 user 0.00	 sys 0.01

PV 测试

$ wc-rs small-file-* | pv
  48414   81402  556859 small-file-1
  48414   81402  556859 small-file-2
  48414   81402  556859 small-file-3
 145242  244206 1670577 total

 159 B 0:00:00 [ 3.1KiB/s] [  <=>                ]

$ ./target/release/wc-rs small-file-* | pv
 48414	81402	556859	small-file-1
 48414	81402	556859	small-file-2
 48414	81402	556859	small-file-3
 145242	244206	1670577	total

 186 B 0:00:00 [9.57KiB/s] [  <=>                ]

使用 2 个文件进行测试,每个文件有 200 万行

时间测试

$ \time  wc-rs big-file-*
 2091965  3549748 24604624 big-file-1
 2091965  3549748 24604624 big-file-2
 4183930  7099496 49209248 total

 real 0:01.14	 user 1.11	 sys 0.02

$ \time  ./target/release/wc-rs big-file-*
2091965	3549748	24604624	big-file-1
2091965	3549748	24604624	big-file-2
4183930	7099496	49209248	total

 real 0:00.49	 user 0.36	 sys 0.12

PV 测试

$ wc-rs big-file-* | pv
 2091965  3549748 24604624 big-file-1
 2091965  3549748 24604624 big-file-2
 4183930  7099496 49209248 total

 121 B 0:00:01 [ 101 B/s] [    <=>               ]

$ ./target/release/wc-rs big-file-* | pv
2091965	3549748	24604624	big-file-1
2091965	3549748	24604624	big-file-2
4183930	7099496	49209248	total

 148 B 0:00:00 [ 315 B/s] [  <=>                  ]

使用 2 个文件进行测试,每个文件有 1000 万行

时间测试

$ \time  wc-rs bigger-file-*
 10048406  17328448 124739305 bigger-file-1
 10446226  18017383 129746037 bigger-file-2
 20494632  35345831 254485342 total

 real 0:05.73	 user 5.66	 sys 0.05

$ \time  ./target/release/wc-rs bigger-file-*
 10048406	17328448	124739305	bigger-file-1
 10446226	18017383	129746037	bigger-file-2
 20494632	35345831	254485342	total

 real 0:02.20	 user 1.64	 sys 0.55

PV 测试

 wc-rs big-file-* | pv
 10048406  17328448 124739305 bigger-file-1
 10446226  18017383 129746037 bigger-file-2
 20494632  35345831 254485342 total

 130 B 0:00:05 [22.5 B/s] [    <=>            ]

 ./target/release/wc-rs bigger-file-* | pv
 10048406  17328448 124739305 bigger-file-1
 10446226  18017383 129746037 bigger-file-2
 20494632  35345831 254485342 total

 157 B 0:00:02 [69.5 B/s] [  <=>              ]

使用更密集的 1000 万行文件进行测试

这里的速度开始稍微慢一些。这个文件比之前的文件多一倍的字节数量和几乎一倍的大小 (~250MB)

时间测试

$ \time -p wc-rs big-and-chonky.txt
10048951    31711680    274285495  big-and-chonky.txt

real 4.72   user 4.67   sys 0.04

$ \time -p ./target/release/wc-rs big-and-chonky.txt
10048951	31711680	274285495  big-and-chonky.txt

real 1.89   user 1.36   sys 0.53

PV 测试

$ wc-rs big-and-chonky.txt | pv
10048951    31711680    274285495   big-and-chonky.txt

46 B 0:00:04 [9.81 B/s] [  <=>                  ]

$ ./target/release/wc-rs big-and-chonky.txt | pv
10048951    31711680    274285495   big-and-chonky.txt

55 B 0:00:01 [29.2 B/s] [  <=>                  ]

待办事项

  • 如果没有提供文件路径,则读取 stdin
  • 添加行长度标志 L
  • 添加字节标志 c

依赖关系

~0.7–1MB