Created
March 6, 2025 10:20
-
-
Save qatoqat/7cd3a741ca3f407979229fae3e1f3fda to your computer and use it in GitHub Desktop.
Benchmark arc + bool + atomic bool + option
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // Arc<AtomicBool> access: 4.3390258s | |
| // Arc<bool> access: 3.3204702s | |
| // Option<Arc<AtomicBool>> access: 4.1391463s | |
| // Option<Arc<bool>> access: 3.3405671s | |
| // Weak<AtomicBool> access after drop: 6.6603574s | |
| // Weak<bool> access after drop: 6.5926837s | |
| use std::sync::{Arc, Weak}; | |
| use std::sync::atomic::AtomicBool; | |
| use std::time::Instant; | |
| fn benchmark<F: Fn()>(name: &str, iterations: usize, func: F) { | |
| let start = Instant::now(); | |
| for _ in 0..iterations { | |
| func(); | |
| } | |
| let duration = start.elapsed(); | |
| println!("{}: {:?}", name, duration); | |
| } | |
| fn main() { | |
| let iterations = 10_000_000_000; | |
| // Benchmark Arc<AtomicBool> | |
| let atomic_flag = Arc::new(AtomicBool::new(true)); | |
| benchmark("Arc<AtomicBool> access", iterations, || { | |
| let value = atomic_flag.load(std::sync::atomic::Ordering::SeqCst); | |
| std::hint::black_box(value); | |
| }); | |
| // Benchmark Arc<bool> | |
| let bool_flag = Arc::new(true); | |
| benchmark("Arc<bool> access", iterations, || { | |
| let value = *bool_flag; | |
| std::hint::black_box(value); | |
| }); | |
| // Benchmark Option<Arc<AtomicBool>> | |
| let option_atomic_flag = Some(Arc::new(AtomicBool::new(true))); | |
| benchmark("Option<Arc<AtomicBool>> access", iterations, || { | |
| if let Some(ref flag) = option_atomic_flag { | |
| let value = flag.load(std::sync::atomic::Ordering::SeqCst); | |
| std::hint::black_box(value); | |
| } | |
| }); | |
| // Benchmark Option<Arc<bool>> | |
| let option_bool_flag = Some(Arc::new(true)); | |
| benchmark("Option<Arc<bool>> access", iterations, || { | |
| if let Some(ref flag) = option_bool_flag { | |
| let value = **flag; | |
| std::hint::black_box(value); | |
| } | |
| }); | |
| // Simulate drop scenarios | |
| let weak_atomic_flag: Weak<AtomicBool> = Arc::downgrade(&atomic_flag); | |
| let weak_bool_flag: Weak<bool> = Arc::downgrade(&bool_flag); | |
| drop(atomic_flag); | |
| drop(bool_flag); | |
| benchmark("Weak<AtomicBool> access after drop", iterations, || { | |
| if let Some(flag) = weak_atomic_flag.upgrade() { | |
| let value = flag.load(std::sync::atomic::Ordering::SeqCst); | |
| std::hint::black_box(value); | |
| } | |
| }); | |
| benchmark("Weak<bool> access after drop", iterations, || { | |
| if let Some(flag) = weak_bool_flag.upgrade() { | |
| let value = *flag; | |
| std::hint::black_box(value); | |
| } | |
| }); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment