gpt4 book ai didi

rust - 如何在 Rust 中为 Criterion 基准创建随机输入

转载 作者:行者123 更新时间:2023-12-03 11:43:56 25 4
gpt4 key购买 nike

我正在尝试对 annotate 进行基准测试例程使用 Criterion 基准测试库。例程检查 &[&str]参数(二维方串)并返回 Vec<String>我怀疑它的执行时间可能取决于参数的内容。因此,我想随机化单个工作负载的输入,在这种情况下,工作负载意味着字符串参数的宽度和高度(通常是宽度 == 高度)。
我注意到标准有 iter_batchediter_batched_ref采用两个闭包而不是单个定时闭包、一个设置和一个例程(定时)的方法。它们都是 FnMut 所以所有捕获的变量都是可变引用(据我所知)。所以我尝试随机化 Vec<Vec<u8>> 的内容在设置中,而例程只调用我的 annotate功能。

fn plant_mines<R: Rng + ?Sized>(mfield: &mut Vec<Vec<u8>>, rng: &mut R) {
mfield.into_iter().flatten().for_each(|x| *x = if rng.gen::<f32>() < MINE_RATE {MINE} else {EMPTY});
}

pub fn benchmark(c: &mut Criterion) {
let mut rng = rand_pcg::Pcg64Mcg::seed_from_u64(RAND_SEED);
let bench_params : [(usize, usize); 4] = [
(3, 3),
(5, 5),
(8, 8),
(16, 16)
];

let dims2str = |d : (usize, usize)| { let (w, h) = d; format!("{:}, {:}", w, h) };

let mut group = c.benchmark_group("Minefield Benchmark");
for dims in bench_params.iter() {
group.bench_with_input(BenchmarkId::from_parameter(dims2str(*dims)), dims, |b, (w, h)| {
let mut mf : Vec<Vec<u8>> = (0..*h).map(|_| iter::repeat(EMPTY).take(*w).collect::<Vec<_>>()).collect();
let mf_ref = mf.iter().map(|vu8| str::from_utf8(&vu8).unwrap()).collect::<Vec<&str>>();

b.iter_batched(|| {
plant_mines(&mut mf, &mut rng);
}, |_| annotate(&mf_ref), BatchSize::SmallInput);
});
}
group.finish();
}
通常,设置函数应该为要使用的例程生成输入,但在这种情况下,我省略了它们。 mf_ref保存 Vec<Vec<u8>> 的引用向量而且我不想在定时例程中创建/分配这个向量,否则它会为基准测试产生更多的噪音。不幸的是,借阅检查员并不高兴。
enter image description here
我试图在 Setup 闭包中创建输入向量,但它无法将引用向量返回到定时例程。我试图了解 Cell 中的任何一个或 RefCell可以解决问题,但我无法掌握足够的应用程序(如果可能)。 Cell自从 Vec 以来不可能没有实现 Copy特质,我理解。
如何在仅对 annotate 进行基准测试时满足编译器的要求函数并为每批样本使用随机输入?

最佳答案

您没有按预期使用批处理机制,这样做将解决您的冲突借用问题。而不是结束 mf_ref 的基准例程, 你应该创建 mf在设置关闭并返回它。这样,就不会共享对 mf 的可变引用。 .

b.iter_batched(|| {
let mut mf : Vec<Vec<u8>> = (0..*h).map(|_| iter::repeat(EMPTY).take(*w).collect::<Vec<_>>()).collect();
plant_mines(&mut mf, &mut rng);
mf
}, |mf| annotate(&mf), BatchSize::SmallInput);

请注意,这也摆脱了 mf_ref的转换为 &str .除非字符串都是 &'static str,否则这里不可能(容易)实现。 (如果它们始终是对应于 MINE 或 EMPTY 的字符串,则可以这样做,这样您就可以有两个对应的字符串文字);你需要重新设计你的 annotate因此它适用于拥有的结构或仅引用 &'static str 的结构s。 (或者你可以把它放在 annotate 旁边的基准闭包中,但是你正在测量它。)
当然,您不应该仅仅为了基准而 reshape 您的代码,但这可能会给您在其他地方的灵 active ,因为长期引用通常不方便。我不能确切地告诉你该怎么做,因为我不知道是什么 annotate MINE 的值是什么?和 EMPTY是。

关于rust - 如何在 Rust 中为 Criterion 基准创建随机输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66088842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com