#byte-slice #algorithm #utf-8 #points #count #counting #occurrence

无std bytecount

快速计算字节或UTF-8码点在字节数组中的出现次数

19个版本

0.6.8 2024年4月19日
0.6.7 2023年10月24日
0.6.3 2022年6月1日
0.6.2 2020年12月1日
0.1.4 2016年10月4日

#16算法

Download history 321229/week @ 2024-05-02 334245/week @ 2024-05-09 352611/week @ 2024-05-16 326034/week @ 2024-05-23 411638/week @ 2024-05-30 357889/week @ 2024-06-06 490877/week @ 2024-06-13 356315/week @ 2024-06-20 359191/week @ 2024-06-27 340679/week @ 2024-07-04 379866/week @ 2024-07-11 319843/week @ 2024-07-18 337150/week @ 2024-07-25 320029/week @ 2024-08-01 447540/week @ 2024-08-08 363205/week @ 2024-08-15

1,526,933 每月下载量
1,446 个crate中 (88 个直接使用)

Apache-2.0/MIT

43KB
939

bytecount

真正快速地计算字节

Continuous integration Windows build status Current Version License: Apache 2.0/MIT

此实现使用了Joshua Landau的“hyperscreamingcount”算法,比其他任何方法都更快。newlinebench仓库对旧版本的此仓库有进一步基准测试。

要在您的crate中使用bytecount,如果您有cargo-edit,只需在以crate根目录为当前路径的终端中输入cargo add bytecount即可。否则,您可以手动编辑您的Cargo.toml,将以下内容添加到您的[dependencies]部分:

在您的crate根目录(lib.rsmain.rs,具体取决于您是编写库还是应用程序),添加extern crate bytecount;。现在您可以使用以下方式简单地使用bytecount::count

extern crate bytecount;

fn main() {
    let mytext = "some potentially large text, perhaps read from disk?";
    let spaces = bytecount::count(mytext.as_bytes(), b' ');
    ..
}

bytecount支持两个功能来利用现代CPU的功能,从而大大加快计数。要允许您的用户使用它们,请将以下内容添加到您的Cargo.toml

[features]
runtime-dispatch-simd = ["bytecount/runtime-dispatch-simd"]
generic-simd = ["bytecount/generic-simd"]

第一个,runtime-dispatch-simd,允许在运行时检测SIMD功能,这允许使用SSE2和AVX2代码路径,但不能与no_std一起使用。

您的用户可以使用以下方法使用运行时调度编译

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

第二个是 generic-simd,它使用 std::simd#![feature(portable_simd)] 来提供一个快速的、与架构无关的 SIMD 代码路径,但需要运行在 nightly 版本上。

您的用户可以使用以下方法编译此代码路径:

cargo build --release --features generic-simd

为更具体的架构构建也会提高性能。您可以使用以下方法实现:

RUSTFLAGS="-C target-cpu=native" cargo build --release

标量算法的详细解释见 此处

注意:版本 0.4.0 及之前版本与 Rust 1.20.0 兼容。版本 0.5.0 至 0.6.0 需要 Rust 1.26 或更高版本,并且至少需要 1.27.2 才能使用 SIMD。从 0.6.0 版本开始需要 Rust 1.32.0 或更高版本。

许可证

根据您的意愿,许可协议如下:

无运行时依赖