对 Rust Crypto 的 AES 模块进行基准测试

Benchmarking Rust Crypto's AES module

我正在尝试对 rust-crypto crate 进行基准测试,重点关注 ECB 模式下的 AES 模块,我想将基准与 openssl speed -evp aes-128-ecb 的输出进行比较。 问题在于,我目前的 Rust 代码已经进入了性能死胡同,我无法仅通过编译器优化来克服这一点。我 100% 确定正在使用 AES 硬件指令,但我当前的基准测试仍然远远落后于 openssl 的输出,如下所示。我真的不知道如何从这里开始,所以如果有人对优化我的代码速度有任何想法(大小无关紧要),我们将不胜感激!

这是我的代码的最基本版本,它对我可以在 3 秒内使用 AES-128-ECB 加密的 16 字节块的数量进行基准测试:

    let mut block = GenericArray::from([0u8; 16]);
    let key = GenericArray::from([0u8; 16]);
    let cipher = Aes128::new(&key);

    let mut counter = 0;
    let end = Duration::from_secs(3);
    let now = Instant::now();
    while now.elapsed() < end {
        cipher.encrypt_block(&mut block);
        counter += 1;
    }
    let time = now.elapsed();
    println!(
        "Doing aes-128-ecb for 3s on {} size blocks: {} aes-128-ecb's in {:.2?}",
        block.len(),
        counter,
        time
    );

这是我在 cargo.toml 中的发布配置文件的定义:

[profile.release]
opt-level = 3
debug = false
rpath = false
lto = "fat"
panic = "abort"
debug-assertions = false
codegen-units = 1

下面是我编译程序的方式:

RUSTFLAGS="-Ctarget-cpu=native --emit=asm" cargo build --release --target=x86_64-unknown-linux-gnu

这是openssl speed -evp aes-128-ecb的输出:

Doing aes-128-ecb for 3s on 16 size blocks: 190025974 aes-128-ecb's in 2.99s

这是我的代码的输出:

Doing aes-128-ecb for 3s on 16 size blocks: 146152536 aes-ecb's in 3.00s

如您所见,大约有 4500 万个区块的差异,我真的不知道如何弥合这个差距。

我已经放弃了创建类似于 openssl speed 的输出的想法,而是让自己熟悉 criterion crate 及其 cycles-per-byte 插件以正确地对加密函数进行基准测试。 这导致了一些有用的见解,如果有人感兴趣,可以在此处找到源代码:RustCrypto-AES-Benchmarks