I’m still working on a benchmark for my wordle solver. The thing itself works, but I want it to print statuses while benching.
I cannot do it. I’ve spent hours on this, even tried to make the bench async and run it in a separate Tokio task. I cannot share my bench strict over a thread, and cloning is impossible too, because of something.
Sometimes, the lifetime and ownership stuff of rust really gets annoying. C would’ve just done the stuff and be done with it. (Maybe)
I understand why it does not work, but I don’t know how to achieve what I’m looking for.
This is the code snippet from the binary:
let wl = BuiltinWList::default();
let builder: GameBuilder<'_, BuiltinWList> = game::Game::builder(&wl)
.length(cli.length)
.max_steps(cli.max_steps)
.precompute(cli.precompute);
let solver: AnyBuiltinSolver<'_, BuiltinWList> = cli.solver.to_solver(&wl);
let bench = BuiltinBenchmark::build(&wl, solver, builder, cli.threads)?;
trace!("{bench:#?}");
bench.start()?;
loop {
sleep_ms(1000);
println!("{}", bench.report());
if bench.is_finished() {
break;
}
}
Ok(())
}
From the CI
error[E0521]: borrowed data escapes outside of method
--> src/bench/builtin.rs:79:18
|
23 | impl<'wl, WL, SL> Benchmark<'wl, WL, SL> forBuiltinBenchmark<'wl, WL, SL>
| --- lifetime `'wl` defined here
...
75 | fnstart(&'wlself, n: usize) -> WResult<()> {
| --------- `self` is a reference that is only valid in the method body
...
79 | letth = std::thread::spawn(move||{
| __________________^
80 | | Self::bench(n, report, solver, builder)
81 | | });
| | ^
| | |
| |__________`self` escapes the method body here
| argument requires that `'wl` must outlive `'static`
error[E0597]: `builder` does not live long enough
--> src/bench/mod.rs:54:32
|
21 | pubtraitBenchmark<'wl, WL, SL>: Sized + Debug + Sync
| --- lifetime `'wl` defined here
...
51 | .for_each_with(report.clone(), |outside_data, _i| {
| ------------------ value captured here
...
54 | .play(&mut builder.build().expect("could not create game"))
| ^^^^^^^----------------------------------------
| |
| borrowed value does not live long enough
| argument requires that `builder` is borrowed for `'wl`
...
62 | }
| - `builder` dropped here while still borrowed
I’m still working on a benchmark for my wordle solver. The thing itself works, but I want it to print statuses while benching.
I cannot do it. I’ve spent hours on this, even tried to make the bench async and run it in a separate Tokio task. I cannot share my bench strict over a thread, and cloning is impossible too, because of something.
Sometimes, the lifetime and ownership stuff of rust really gets annoying. C would’ve just done the stuff and be done with it. (Maybe)
I you share your code here, maybe someone can help.
The whole code is here
(It does not compile right now)
I understand why it does not work, but I don’t know how to achieve what I’m looking for.
This is the code snippet from the binary:
From the CI
error[E0521]: borrowed data escapes outside of method --> src/bench/builtin.rs:79:18 | 23 | impl<'wl, WL, SL> Benchmark<'wl, WL, SL> for BuiltinBenchmark<'wl, WL, SL> | --- lifetime `'wl` defined here ... 75 | fn start(&'wl self, n: usize) -> WResult<()> { | --------- `self` is a reference that is only valid in the method body ... 79 | let th = std::thread::spawn(move||{ | __________________^ 80 | | Self::bench(n, report, solver, builder) 81 | | }); | | ^ | | | | |__________`self` escapes the method body here | argument requires that `'wl` must outlive `'static` error[E0597]: `builder` does not live long enough --> src/bench/mod.rs:54:32 | 21 | pub trait Benchmark<'wl, WL, SL>: Sized + Debug + Sync | --- lifetime `'wl` defined here ... 51 | .for_each_with(report.clone(), |outside_data, _i| { | ------------------ value captured here ... 54 | .play(&mut builder.build().expect("could not create game")) | ^^^^^^^---------------------------------------- | | | borrowed value does not live long enough | argument requires that `builder` is borrowed for `'wl` ... 62 | } | - `builder` dropped here while still borrowed