Rust Criterion基准测试模块 `未解决的导入`crate::some_module``

4

我有一个二进制项目,其中有很多内部模块来组织功能。

我正在尝试使用Criterion进行基准测试。

错误:

error[E0432]: unresolved import `crate::some_module`
 --> benches/benchmarks.rs:3:5
  |
3 | use crate::some_module;
  |     ^^^^^^^^^^^^^^^^^^ no `some_module` in the root

error: aborting due to previous error

最简示例 .zip: https://drive.google.com/file/d/1TASKI9_ODJniamHp3RBRscoflabPT-kP/view?usp=sharing

我当前的最简示例如下:

.
├── Cargo.lock
├── Cargo.toml
├── src/
│   ├── main.rs
│   └── some_module/
│       ├── mod.rs
│       └── some_module_file.rs
└── benches/
    └── benchmarks.rs

Cargo.toml:

[package]
name = "criterion-bin-test"
version = "0.1.0"
authors = ["Jonathan <jonthanwoollettlight@gmail.com>"]
edition = "2018"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]

[dev-dependencies]
criterion = "0.3"

[[bench]]
name = "benchmarks"
harness = false

main.rs:

mod some_module;

fn main() {
    println!("Hello, world!");

    println!("{}",some_module::some_mod_file::two());
}

mod.rs:

pub mod some_mod_file;

some_module_file:

pub fn two() -> i32 {
    2
}

benchmarks.rs:

use criterion::{black_box, criterion_group, criterion_main, Criterion};

use crate::some_module;

fn fibonacci(n: u64) -> u64 {
    match n {
        0 => 1,
        1 => 1,
        n => fibonacci(n-1) + fibonacci(n-2),
    }
}

fn criterion_benchmark(c: &mut Criterion) {
    c.bench_function("fib 20", |b| b.iter(|| fibonacci(black_box(20))));
}

criterion_group!(benches, criterion_benchmark);
criterion_main!(benches);

错误出现在use crate::some_module,我无法弄清楚如何将Criterion基准应用于内部模块。
我的当前项目中的测试是这样处理的:
.
├── Cargo.lock
├── Cargo.toml
├── src/
|   ├── main.rs
.   ├── tests.rs
    . some_module/
        ├── mod.rs
        ├── tests.rs
        .

允许使用 use crate::some_module

2
好的,所以将“benchmarks.rs”移动到“src/”中会产生错误“找不到'benchmarks'测试板,请指定bench.path”,我想这与在“Cargo.toml”中设置[[bench]]\n name = "benchmarks" \n harness = false有关,不确定如何继续处理? - Jonathan Woollett-light
如果你选择将基准测试移动到二进制文件中,那么你就不再需要单独构建一个基准测试目标(因此应该从 Cargo.toml 中删除该目标)。然而,我对 Criterion 是否支持嵌入式基准测试并不熟悉,可能不支持。我想你最好还是采用另一种方法,将 some_module 移动到库目标中,以便你可以按照 Criterion 文档的要求使用隔离的基准测试目标。 - eggyal
我该如何将 some_module 移入到库目标中? - Jonathan Woollett-light
1
最简单的方法就是将 main.rs 移动到 /src/bin,将 mod some_module; 更改为 use criterion_bin_test::some_module;,然后创建 /src/lib.rs 并包含 pub mod some_module; - eggyal
1
请查看 https://dev59.com/7F8d5IYBdhLWcg3wVQ69 - eggyal
显示剩余2条评论
1个回答

4

对于任何遇到此问题的人。

在实施基准测试(或示例)时,如果我们想包括一些我们的模块/函数,我们必须以与包含已安装软件包中的那些相同的方式进行操作。

例如,在上面的问题中,存在一个错误指出:

error[E0432]: unresolved import `crate::some_module`
 --> benches/benchmarks.rs:3:5
  |
3 | use crate::some_module;
  |     ^^^^^^^^^^^^^^^^^^ no `some_module` in the root

error: aborting due to previous error

那是因为它应该阅读如下:

use criterion-bin-test::some_module;

在实现示例或基准测试时,将criterion-bin-test用作实际包名称,而不是使用crate::


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接