对 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
我正在尝试对 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