set up tests and examples
This commit is contained in:
		
							
								
								
									
										141
									
								
								radixtree/benches/radixtree_benchmarks.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										141
									
								
								radixtree/benches/radixtree_benchmarks.rs
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,141 @@
 | 
			
		||||
use criterion::{black_box, criterion_group, criterion_main, Criterion};
 | 
			
		||||
use radixtree::RadixTree;
 | 
			
		||||
use std::path::PathBuf;
 | 
			
		||||
use tempfile::tempdir;
 | 
			
		||||
 | 
			
		||||
fn criterion_benchmark(c: &mut Criterion) {
 | 
			
		||||
    // Create a temporary directory for benchmarks
 | 
			
		||||
    let temp_dir = tempdir().expect("Failed to create temp directory");
 | 
			
		||||
    let db_path = temp_dir.path().to_str().unwrap();
 | 
			
		||||
    
 | 
			
		||||
    // Benchmark set operation
 | 
			
		||||
    c.bench_function("set", |b| {
 | 
			
		||||
        let mut tree = RadixTree::new(db_path, true).unwrap();
 | 
			
		||||
        let mut i = 0;
 | 
			
		||||
        b.iter(|| {
 | 
			
		||||
            let key = format!("benchmark_key_{}", i);
 | 
			
		||||
            let value = format!("benchmark_value_{}", i).into_bytes();
 | 
			
		||||
            tree.set(&key, value).unwrap();
 | 
			
		||||
            i += 1;
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    // Setup tree with data for get/list/delete benchmarks
 | 
			
		||||
    let mut setup_tree = RadixTree::new(db_path, true).unwrap();
 | 
			
		||||
    for i in 0..1000 {
 | 
			
		||||
        let key = format!("benchmark_key_{}", i);
 | 
			
		||||
        let value = format!("benchmark_value_{}", i).into_bytes();
 | 
			
		||||
        setup_tree.set(&key, value).unwrap();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    // Benchmark get operation
 | 
			
		||||
    c.bench_function("get", |b| {
 | 
			
		||||
        let mut tree = RadixTree::new(db_path, false).unwrap();
 | 
			
		||||
        let mut i = 0;
 | 
			
		||||
        b.iter(|| {
 | 
			
		||||
            let key = format!("benchmark_key_{}", i % 1000);
 | 
			
		||||
            let _value = tree.get(&key).unwrap();
 | 
			
		||||
            i += 1;
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    // Benchmark list operation
 | 
			
		||||
    c.bench_function("list", |b| {
 | 
			
		||||
        let mut tree = RadixTree::new(db_path, false).unwrap();
 | 
			
		||||
        b.iter(|| {
 | 
			
		||||
            let _keys = tree.list("benchmark_key_1").unwrap();
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    // Benchmark getall operation
 | 
			
		||||
    c.bench_function("getall", |b| {
 | 
			
		||||
        let mut tree = RadixTree::new(db_path, false).unwrap();
 | 
			
		||||
        b.iter(|| {
 | 
			
		||||
            let _values = tree.getall("benchmark_key_1").unwrap();
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    // Benchmark update operation
 | 
			
		||||
    c.bench_function("update", |b| {
 | 
			
		||||
        let mut tree = RadixTree::new(db_path, false).unwrap();
 | 
			
		||||
        let mut i = 0;
 | 
			
		||||
        b.iter(|| {
 | 
			
		||||
            let key = format!("benchmark_key_{}", i % 1000);
 | 
			
		||||
            let new_value = format!("updated_value_{}", i).into_bytes();
 | 
			
		||||
            tree.update(&key, new_value).unwrap();
 | 
			
		||||
            i += 1;
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    // Benchmark delete operation
 | 
			
		||||
    c.bench_function("delete", |b| {
 | 
			
		||||
        // Create a fresh tree for deletion benchmarks
 | 
			
		||||
        let delete_dir = tempdir().expect("Failed to create temp directory");
 | 
			
		||||
        let delete_path = delete_dir.path().to_str().unwrap();
 | 
			
		||||
        let mut tree = RadixTree::new(delete_path, true).unwrap();
 | 
			
		||||
        
 | 
			
		||||
        // Setup keys to delete
 | 
			
		||||
        for i in 0..1000 {
 | 
			
		||||
            let key = format!("delete_key_{}", i);
 | 
			
		||||
            let value = format!("delete_value_{}", i).into_bytes();
 | 
			
		||||
            tree.set(&key, value).unwrap();
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        let mut i = 0;
 | 
			
		||||
        b.iter(|| {
 | 
			
		||||
            let key = format!("delete_key_{}", i % 1000);
 | 
			
		||||
            // Only try to delete if it exists
 | 
			
		||||
            if tree.get(&key).is_ok() {
 | 
			
		||||
                tree.delete(&key).unwrap();
 | 
			
		||||
            }
 | 
			
		||||
            i += 1;
 | 
			
		||||
        });
 | 
			
		||||
    });
 | 
			
		||||
    
 | 
			
		||||
    // Benchmark prefix operations with varying tree sizes
 | 
			
		||||
    let mut group = c.benchmark_group("prefix_operations");
 | 
			
		||||
    
 | 
			
		||||
    for &size in &[100, 1000, 10000] {
 | 
			
		||||
        // Create a fresh tree for each size
 | 
			
		||||
        let size_dir = tempdir().expect("Failed to create temp directory");
 | 
			
		||||
        let size_path = size_dir.path().to_str().unwrap();
 | 
			
		||||
        let mut tree = RadixTree::new(size_path, true).unwrap();
 | 
			
		||||
        
 | 
			
		||||
        // Insert data with common prefixes
 | 
			
		||||
        for i in 0..size {
 | 
			
		||||
            let prefix = match i % 5 {
 | 
			
		||||
                0 => "user",
 | 
			
		||||
                1 => "post",
 | 
			
		||||
                2 => "comment",
 | 
			
		||||
                3 => "product",
 | 
			
		||||
                _ => "category",
 | 
			
		||||
            };
 | 
			
		||||
            let key = format!("{}_{}", prefix, i);
 | 
			
		||||
            let value = format!("value_{}", i).into_bytes();
 | 
			
		||||
            tree.set(&key, value).unwrap();
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        // Benchmark list operation for this size
 | 
			
		||||
        group.bench_function(format!("list_size_{}", size), |b| {
 | 
			
		||||
            b.iter(|| {
 | 
			
		||||
                for prefix in &["user", "post", "comment", "product", "category"] {
 | 
			
		||||
                    let _keys = tree.list(prefix).unwrap();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
        
 | 
			
		||||
        // Benchmark getall operation for this size
 | 
			
		||||
        group.bench_function(format!("getall_size_{}", size), |b| {
 | 
			
		||||
            b.iter(|| {
 | 
			
		||||
                for prefix in &["user", "post", "comment", "product", "category"] {
 | 
			
		||||
                    let _values = tree.getall(prefix).unwrap();
 | 
			
		||||
                }
 | 
			
		||||
            });
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    group.finish();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
criterion_group!(benches, criterion_benchmark);
 | 
			
		||||
criterion_main!(benches);
 | 
			
		||||
		Reference in New Issue
	
	Block a user