11 个稳定版本
2.7.0 | 2022年4月20日 |
---|---|
2.6.0 | 2020年10月30日 |
2.4.2 | 2020年8月19日 |
2.3.0 | 2020年5月13日 |
2.1.0 | 2020年1月19日 |
#1332 in 命令行工具
每月 33 次下载
20KB
301 行
huniq 版本 2
命令行工具,用于从给定输入中删除重复项。请注意,huniq 不对输入进行排序,它只是删除重复项。
SYNOPSIS: huniq -h # Shows help
SYNOPSIS: huniq [-c|--count] [-0|--null|-d DELIM|--delim DELIM]
$ echo -e "foo\nbar\nfoo\nbaz" | huniq
foo
bar
baz
$ echo -e "foo\nbar\nfoo\nbaz" | huniq -c
1 baz
2 foo
1 bar
huniq
替代 sort | uniq
(或使用 gnu sort 的 sort -u
)和 huniq -c
替代 sort | uniq -c
,假设数据已排序,以便可以传递给 uniq
。如果需要排序的输出,则应继续使用 sort | uniq
。
在正常模式下,输出的顺序是稳定的,但在 -c/count 模式下不稳定。
安装
$ cargo install huniq
动机
排序很慢。通过使用散列表/散列集合而不是排序输入,huniq 通常比 sort -u
或 sort | uniq -c
快,这是在用 gnu sort/gnu uniq 进行测试时的情况。
版本历史
版本 1 可在此处找到 here.
版本 2 中的更改
- 添加了 -d/-0 标志,以便您可以指定自定义分隔符
- 完全用 Rust 重新编写。
- 版本 2(取决于您查看的基准测试)比版本 1 快 3.5 倍到 6.5 倍
构建
cargo build --release
要运行测试,请执行
bash ./test.sh
基准测试
您可以使用 bash ./benchmark.sh
执行基准测试。它们将一直执行,直到您手动终止它们(例如,按 Ctrl-C)。
这些基准测试通过重复向实现提供 /usr/share/dict/* 中的数据,并使用 Unix time
工具测量内存使用情况和处理数据的所需时间来工作。
对于uniq
算法,结果如下:我们可以看到,在性能方面,Rust实现几乎超过了所有其他方法。只有在你真的需要休息一下喝杯咖啡的时候才使用排序,因为使用huniq你不会得到休息!它的性能比C++实现高出6.5倍(对于很少的重复项)到3.5倍(大约98%的重复项)。与sort -u
相比:huniq的速度大约快30倍。
如果你在寻找内存效率,请使用datamash,它的速度不如huniq,但内存使用量最少(大约低3倍);如果datamash不行,请使用sort|uniq
,它的速度要慢得多,但比datamash稍微多一点点内存。
repetitions implementation seconds memory/kb
1 huniq2-rust 0.26 29524
1 huniq1-c++ 1.67 26188
1 awk 1.63 321936
1 datamash 1.78 9644
1 shell 7.30 9736
2 huniq2-rust 0.84 29592
2 huniq1-c++ 3.28 26180
2 awk 3.71 322012
2 datamash 4.60 9636
2 shell 16.68 9740
5 huniq2-rust 2.02 29648
5 huniq1-c++ 6.21 26184
5 awk 7.69 322012
5 datamash 9.10 9992
5 shell 44.71 10184
10 huniq2-rust 3.40 29676
10 huniq1-c++ 12.84 26172
10 awk 16.73 321940
10 datamash 24.44 10032
10 shell 93.75 10036
50 huniq2-rust 14.68 29612
50 huniq1-c++ 55.32 26200
50 awk 74.91 321940
50 datamash 103.54 10936
50 shell 453.94 10956
100 huniq2-rust 43.65 29492
100 huniq1-c++ 154.99 26180
100 awk 239.66 321956
100 datamash 285.94 12148
100 shell 1062.07 12208
对于计数huniq -c
实现,速度优势不是很明显:这里,Rust实现比C++实现快25%到50%,比sort | uniq -c
快5倍到10倍。
然而,Rust实现的内存使用增加非常严重:Rust实现需要的内存比C++实现多2.2倍,比sort | uniq
多10倍到12倍。
repetitions implemetation seconds memory/kb
1 huniq2-rust 1.47 132096
1 huniq1-c++ 1.85 60196
1 awk 2.79 362940
1 datamash 2.28 9636
1 shell 7.71 11716
2 huniq2-rust 2.32 132052
2 huniq1-c++ 2.98 60156
2 awk 4.65 363016
2 datamash 5.27 9732
2 shell 16.37 11680
5 huniq2-rust 4.98 132092
5 huniq1-c++ 7.54 60128
5 awk 9.37 363016
5 datamash 11.22 9964
5 shell 44.77 11948
10 huniq2-rust 8.81 132048
10 huniq1-c++ 13.55 60196
10 awk 16.19 363032
10 datamash 25.12 9908
10 shell 90.01 11976
50 huniq2-rust 45.89 132092
50 huniq1-c++ 74.04 60104
50 awk 85.43 362956
50 datamash 141.90 10996
50 shell 454.42 12876
100 huniq2-rust 90.80 132080
100 huniq1-c++ 150.41 60196
100 awk 163.13 363008
100 datamash 322.70 12212
100 shell 933.67 14100
未来方向
在功能方面,huniq已经相当完善,但性能和内存使用应在未来得到改进。
这首先涉及到一个更好的基准测试设置,这可能包括一个额外的Rust应用程序,该程序将使用随机数生成器为huniq生成测试数据,并获取参数,如要创建的元素数量、重复项的比率(0-1)、要输出的字符串长度等……
然后基于改进的基准测试能力,可以尝试一些优化,如短字符串优化、区域分配、不同的哈希函数、使用内存优化的哈希表、为uniq
函数使用身份函数(因为我们已经提供了哈希值,所以不需要进行第二轮哈希)。
许可证
版权所有 © (C) 2020,Karolin Varner。保留所有权利。
重新分发和使用源代码和二进制形式,无论是否修改,只要满足以下条件
Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
Neither the name of the Karolin Varner nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.
本软件由版权所有者和贡献者提供“现状”以及任何明示或暗示的保证,包括但不限于适销性和针对特定目的的适用性保证均予以放弃。在任何情况下,Softwear,BV不对任何直接、间接、偶然、特殊、示范性或后果性损害(包括但不限于替代商品或服务的采购;使用、数据或利润的损失;或业务中断)承担责任,无论该损害是由于何种原因造成的,无论基于何种责任理论,包括合同、严格责任或侵权(包括疏忽或其它)责任,即使已被告知本软件使用可能产生此类损害。
依赖关系
~2.5MB
~41K SLoC