我的项目路径 struct 如下:

demo
├── benches
│   └── crypto_bench.rs
├── src
│   ├── main.rs
│   └── crypto.rs
├── Cargo.lock
└── Cargo.toml

crypto.rs包含一个带实现的 struct Crypto.

如何使用长凳文件夹中crypto_bench.rs中的crypto.rs

我try 过extern cratemodsuperuse的各种变化.

推荐答案

这里有一个字面上的答案,但是don't actually use this

#![feature(test)]
extern crate test;

#[path = "../src/foo.rs"] // Here
mod foo;

#[bench]
fn bencher(_: &mut test::Bencher) {
    println!("{:?}", foo::Thang);
}

事实上,这很可能行不通,因为foo.rs中的代码需要来自其他文件的支持代码,而这些文件不包括在内.


而不是这样做,just create a library.你有一个库的纯粹定义——一段希望在两个不同的可执行文件中使用的代码.你不必放弃拥有一个可执行文件,甚至不必创建单独的目录(参见Rust package with both a library and a binary?),但创建可重用代码是生成good代码的关键组成部分.

你的最终状态看起来像:

demo
├── Cargo.lock
├── Cargo.toml
├── benches
│   └── crypto_bench.rs
├── benchmarks
└── src
    ├── bin
    │   └── main.rs
    ├── crypto.rs
    └── lib.rs

将可重用代码移动到库中:

src/lib.rs

pub mod crypto;

src/crypto.rs

pub struct Crypto;
impl Crypto {
    pub fn secret() {}
}

然后从基准和二进制文件导入库:

benches/crypto_bench.rs

#![feature(test)]

extern crate test;

use demo::crypto::Crypto;
use test::Bencher;

#[bench]
fn speedy(b: &mut Bencher) {
    b.iter(|| Crypto::secret());
}

src/bin/main.rs

use demo::crypto::Crypto;

fn main() {
    Crypto::secret();
    eprintln!("Did the secret thing!");
}

然后,您可以用不同的方式运行它:

$ cargo build
   Compiling demo v0.1.0 (/private/tmp/example)
    Finished dev [unoptimized + debuginfo] target(s) in 0.51s

$ cargo run
    Finished dev [unoptimized + debuginfo] target(s) in 0.01s
     Running `target/debug/main`
Did the secret thing!

$ cargo +nightly bench
   Compiling demo v0.1.0 (/private/tmp/example)
    Finished release [optimized] target(s) in 0.70s
     Running target/release/deps/my_benchmark-5c9c5716763252a0

running 1 test
test speedy ... bench:           1 ns/iter (+/- 0)

test result: ok. 0 passed; 0 failed; 0 ignored; 1 measured; 0 filtered out

另见:

Rust相关问答推荐

trait 中self 的显式生命周期似乎导致E0499无法在循环中多次borrow * emits 器作为可变的

异步FN中的 rust 递归

为潜在的下游实现使用泛型绑定而不是没有泛型绑定的trait

这是不是在不造成嵌套的情况下从枚举中取出想要的变体的惯用方法?

带参考文献的 rust 元组解构

如何向下转换到MyStruct并访问Arc Mutex MyStruct实现的方法?

将Vec<;U8&>转换为Vec<;{Float}&>

Rust 如何返回大类型(优化前)?

在多核嵌入式 Rust 中,我可以使用静态 mut 进行单向数据共享吗?

为什么不能在 Rust 中声明静态或常量 std::path::Path 对象?

如何使用泛型满足 tokio 异步任务中的生命周期界限

Rust 中的方法调用有什么区别?

为什么我不能克隆可克隆构造函数的Vec?

特征中定义的类型与一般定义的类型之间的区别

有没有办法隐藏类型定义?

有没有办法在 Rust 中对 BigInt 进行正确的位移?

如果我立即等待,为什么 `tokio::spawn` 需要一个 `'static` 生命周期?

如何将 while 循环内的用户输入添加到 Rust 中的向量?

C++ 中的 CRTP 是一种表达其他语言中特征和/或 ADT 的方法吗?

在 Rust 中组合特征的不同方法是否等效?