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)
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
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:
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> 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
deleted by creator