forked from mirror/async-std
		
	* Optimization: a slot for the next task to run * Only notify workers when a task is pushed into a queue
		
			
				
	
	
		
			40 lines
		
	
	
	
		
			729 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			40 lines
		
	
	
	
		
			729 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
#![feature(test)]
 | 
						|
 | 
						|
extern crate test;
 | 
						|
 | 
						|
use async_std::sync::{Arc, Mutex};
 | 
						|
use async_std::task;
 | 
						|
use test::Bencher;
 | 
						|
 | 
						|
#[bench]
 | 
						|
fn create(b: &mut Bencher) {
 | 
						|
    b.iter(|| Mutex::new(()));
 | 
						|
}
 | 
						|
 | 
						|
#[bench]
 | 
						|
fn contention(b: &mut Bencher) {
 | 
						|
    b.iter(|| task::block_on(run(10, 1000)));
 | 
						|
}
 | 
						|
 | 
						|
#[bench]
 | 
						|
fn no_contention(b: &mut Bencher) {
 | 
						|
    b.iter(|| task::block_on(run(1, 10000)));
 | 
						|
}
 | 
						|
 | 
						|
async fn run(task: usize, iter: usize) {
 | 
						|
    let m = Arc::new(Mutex::new(()));
 | 
						|
    let mut tasks = Vec::new();
 | 
						|
 | 
						|
    for _ in 0..task {
 | 
						|
        let m = m.clone();
 | 
						|
        tasks.push(task::spawn(async move {
 | 
						|
            for _ in 0..iter {
 | 
						|
                let _ = m.lock().await;
 | 
						|
            }
 | 
						|
        }));
 | 
						|
    }
 | 
						|
 | 
						|
    for t in tasks {
 | 
						|
        t.await;
 | 
						|
    }
 | 
						|
}
 |