mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			115 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use core::hint::black_box;
 | |
| use std::collections::{BTreeSet, HashSet};
 | |
| use std::hash::{DefaultHasher, Hash, Hasher};
 | |
| use std::path::*;
 | |
| 
 | |
| #[bench]
 | |
| #[cfg_attr(miri, ignore)] // Miri isn't fast...
 | |
| fn bench_path_cmp_fast_path_buf_sort(b: &mut test::Bencher) {
 | |
|     let prefix = "my/home";
 | |
|     let mut paths: Vec<_> =
 | |
|         (0..1000).map(|num| PathBuf::from(prefix).join(format!("file {num}.rs"))).collect();
 | |
| 
 | |
|     paths.sort();
 | |
| 
 | |
|     b.iter(|| {
 | |
|         black_box(paths.as_mut_slice()).sort_unstable();
 | |
|     });
 | |
| }
 | |
| 
 | |
| #[bench]
 | |
| #[cfg_attr(miri, ignore)] // Miri isn't fast...
 | |
| fn bench_path_cmp_fast_path_long(b: &mut test::Bencher) {
 | |
|     let prefix = "/my/home/is/my/castle/and/my/castle/has/a/rusty/workbench/";
 | |
|     let paths: Vec<_> =
 | |
|         (0..1000).map(|num| PathBuf::from(prefix).join(format!("file {num}.rs"))).collect();
 | |
| 
 | |
|     let mut set = BTreeSet::new();
 | |
| 
 | |
|     paths.iter().for_each(|p| {
 | |
|         set.insert(p.as_path());
 | |
|     });
 | |
| 
 | |
|     b.iter(|| {
 | |
|         set.remove(paths[500].as_path());
 | |
|         set.insert(paths[500].as_path());
 | |
|     });
 | |
| }
 | |
| 
 | |
| #[bench]
 | |
| #[cfg_attr(miri, ignore)] // Miri isn't fast...
 | |
| fn bench_path_cmp_fast_path_short(b: &mut test::Bencher) {
 | |
|     let prefix = "my/home";
 | |
|     let paths: Vec<_> =
 | |
|         (0..1000).map(|num| PathBuf::from(prefix).join(format!("file {num}.rs"))).collect();
 | |
| 
 | |
|     let mut set = BTreeSet::new();
 | |
| 
 | |
|     paths.iter().for_each(|p| {
 | |
|         set.insert(p.as_path());
 | |
|     });
 | |
| 
 | |
|     b.iter(|| {
 | |
|         set.remove(paths[500].as_path());
 | |
|         set.insert(paths[500].as_path());
 | |
|     });
 | |
| }
 | |
| 
 | |
| #[bench]
 | |
| #[cfg_attr(miri, ignore)] // Miri isn't fast...
 | |
| fn bench_path_hashset(b: &mut test::Bencher) {
 | |
|     let prefix = "/my/home/is/my/castle/and/my/castle/has/a/rusty/workbench/";
 | |
|     let paths: Vec<_> =
 | |
|         (0..1000).map(|num| PathBuf::from(prefix).join(format!("file {num}.rs"))).collect();
 | |
| 
 | |
|     let mut set = HashSet::new();
 | |
| 
 | |
|     paths.iter().for_each(|p| {
 | |
|         set.insert(p.as_path());
 | |
|     });
 | |
| 
 | |
|     b.iter(|| {
 | |
|         set.remove(paths[500].as_path());
 | |
|         set.insert(black_box(paths[500].as_path()))
 | |
|     });
 | |
| }
 | |
| 
 | |
| #[bench]
 | |
| #[cfg_attr(miri, ignore)] // Miri isn't fast...
 | |
| fn bench_path_hashset_miss(b: &mut test::Bencher) {
 | |
|     let prefix = "/my/home/is/my/castle/and/my/castle/has/a/rusty/workbench/";
 | |
|     let paths: Vec<_> =
 | |
|         (0..1000).map(|num| PathBuf::from(prefix).join(format!("file {num}.rs"))).collect();
 | |
| 
 | |
|     let mut set = HashSet::new();
 | |
| 
 | |
|     paths.iter().for_each(|p| {
 | |
|         set.insert(p.as_path());
 | |
|     });
 | |
| 
 | |
|     let probe = PathBuf::from(prefix).join("other");
 | |
| 
 | |
|     b.iter(|| set.remove(black_box(probe.as_path())));
 | |
| }
 | |
| 
 | |
| #[bench]
 | |
| fn bench_hash_path_short(b: &mut test::Bencher) {
 | |
|     let mut hasher = DefaultHasher::new();
 | |
|     let path = Path::new("explorer.exe");
 | |
| 
 | |
|     b.iter(|| black_box(path).hash(&mut hasher));
 | |
| 
 | |
|     black_box(hasher.finish());
 | |
| }
 | |
| 
 | |
| #[bench]
 | |
| fn bench_hash_path_long(b: &mut test::Bencher) {
 | |
|     let mut hasher = DefaultHasher::new();
 | |
|     let path =
 | |
|         Path::new("/aaaaa/aaaaaa/./../aaaaaaaa/bbbbbbbbbbbbb/ccccccccccc/ddddddddd/eeeeeee.fff");
 | |
| 
 | |
|     b.iter(|| black_box(path).hash(&mut hasher));
 | |
| 
 | |
|     black_box(hasher.finish());
 | |
| }
 | 
