this post was submitted on 21 Apr 2024
14 points (100.0% liked)

Rust

111 readers
1 users here now

Welcome to the Rust community! This is a place to discuss about the Rust programming language.

Wormhole

!performance@programming.dev

Credits

  • The icon is a modified version of the official rust logo (changing the colors to a gradient and black background)

founded 1 year ago
MODERATORS
 

Hi rustaceans! What are you working on this week? Did you discover something new, you want to share?

you are viewing a single comment's thread
view the rest of the comments
[–] PlexSheep@infosec.pub 4 points 6 months ago (1 children)

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)

[–] secana@programming.dev 2 points 6 months ago (1 children)

I you share your code here, maybe someone can help.

[–] PlexSheep@infosec.pub 4 points 6 months ago

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