mirror of
https://git.proxmox.com/git/rustc
synced 2025-08-25 02:53:35 +00:00
70 lines
1.4 KiB
Rust
70 lines
1.4 KiB
Rust
use std::thread;
|
|
|
|
use countme::{get, Count};
|
|
|
|
#[derive(Default)]
|
|
struct Foo {
|
|
_c: Count<Self>,
|
|
}
|
|
|
|
#[derive(Default)]
|
|
struct Bar {
|
|
_c: Count<Self>,
|
|
_x: i32,
|
|
}
|
|
|
|
mod deeply {
|
|
pub(crate) mod nested {
|
|
pub(crate) mod module {
|
|
use countme::Count;
|
|
|
|
#[derive(Default)]
|
|
pub(crate) struct Quux {
|
|
_c: Count<Self>,
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
countme::enable(true);
|
|
let t = std::time::Instant::now();
|
|
let n = 5;
|
|
let m = 1_000_000;
|
|
|
|
let mut threads = Vec::new();
|
|
for _ in 0..n {
|
|
threads.push(thread::spawn(move || {
|
|
for _ in 0..m {
|
|
Foo::default();
|
|
}
|
|
}));
|
|
threads.push(thread::spawn(move || {
|
|
let mut xs = Vec::with_capacity(m);
|
|
for _ in 0..m {
|
|
xs.push(Bar::default())
|
|
}
|
|
}));
|
|
threads.push(thread::spawn(move || {
|
|
for _ in 0..m {
|
|
deeply::nested::module::Quux::default();
|
|
}
|
|
}));
|
|
}
|
|
for t in threads {
|
|
t.join().unwrap();
|
|
}
|
|
|
|
let foo = get::<Foo>();
|
|
assert_eq!(foo.total, m * n);
|
|
assert!(foo.max_live >= 1);
|
|
assert_eq!(foo.live, 0);
|
|
|
|
let bar = get::<Bar>();
|
|
assert_eq!(bar.total, m * n);
|
|
assert!(bar.max_live >= m);
|
|
assert_eq!(bar.live, 0);
|
|
|
|
println!("{:?}", t.elapsed());
|
|
}
|