Change Backtrace::enabled atomic from SeqCst to Relaxed by dtolnay · Pull Reques...
source link: https://github.com/rust-lang/rust/pull/92139
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
This atomic is not synchronizing anything outside of its own value, so we don't need the Acquire
/Release
guarantee that all memory operations prior to the store are visible after the subsequent load, nor the SeqCst
guarantee of all threads seeing all of the sequentially consistent operations in the same order.
Using Relaxed
reduces the overhead of Backtrace::capture()
in the case that backtraces are not enabled.
Benchmark
#![feature(backtrace)] use std::backtrace::Backtrace; use std::sync::atomic::{AtomicUsize, Ordering}; use std::thread; use std::time::Instant; fn main() { let begin = Instant::now(); let mut threads = Vec::new(); for _ in 0..64 { threads.push(thread::spawn(|| { for _ in 0..10_000_000 { let _ = Backtrace::capture(); static LOL: AtomicUsize = AtomicUsize::new(0); LOL.store(1, Ordering::Release); } })); } for thread in threads { let _ = thread.join(); } println!("{:?}", begin.elapsed()); }
Before: 6.73 seconds
After: 5.18 seconds
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK