use std::{ops::Index, sync::RwLock}; use append_only_vec::AppendOnlyVec; use scaling::{bench, bench_scaling_gen}; struct RwVec { data: RwLock>, } impl RwVec { fn new() -> Self { RwVec { data: RwLock::new(Vec::new()), } } fn push(&self, val: T) { self.data.write().unwrap().push(val) } fn get(&self, index: usize) -> T { self.data.read().unwrap().index(index).clone() } fn len(&self) -> usize { self.data.read().unwrap().len() } } struct ParkVec { data: parking_lot::RwLock>, } impl ParkVec { fn new() -> Self { ParkVec { data: parking_lot::RwLock::new(Vec::new()), } } fn push(&self, val: T) { self.data.write().push(val) } fn get(&self, index: usize) -> T { self.data.read().index(index).clone() } fn len(&self) -> usize { self.data.read().len() } } fn main() { { println!( "AOV: Filling 10 strings: {}", bench(|| { let v = AppendOnlyVec::new(); for i in 0..10 { v.push(format!("{}", i)); } v }) ); println!( "RWV: Filling 10 strings: {}", bench(|| { let v = RwVec::new(); for i in 0..10 { v.push(format!("{}", i)); } v }) ); println!( "plV: Filling 10 strings: {}", bench(|| { let v = ParkVec::new(); for i in 0..10 { v.push(format!("{}", i)); } v }) ); println!( "Vec: Filling 10 strings: {}", bench(|| { let mut v = Vec::new(); for i in 0..10 { v.push(format!("{}", i)); } v }) ); println!(); println!( "AOV: Filling 100 strings: {}", bench(|| { let v = AppendOnlyVec::new(); for i in 0..100 { v.push(format!("{}", i)); } v }) ); println!( "RWV: Filling 100 strings: {}", bench(|| { let v = RwVec::new(); for i in 0..100 { v.push(format!("{}", i)); } v }) ); println!( "plV: Filling 100 strings: {}", bench(|| { let v = ParkVec::new(); for i in 0..100 { v.push(format!("{}", i)); } v }) ); println!( "Vec: Filling 100 strings: {}", bench(|| { let mut v = Vec::new(); for i in 0..100 { v.push(format!("{}", i)); } v }) ); } println!(); { let min_n = 1000; println!( "AOV: sum: {}", bench_scaling_gen( |n: usize| { let vec = AppendOnlyVec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { vec.iter().copied().sum::() }, min_n ) ); println!( "AOV: reversed sum: {}", bench_scaling_gen( |n: usize| { let vec = AppendOnlyVec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { vec.iter().copied().rev().sum::() }, min_n ) ); println!( "Vec: sum: {}", bench_scaling_gen( |n: usize| { let mut vec = Vec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { vec.iter().copied().sum::() }, min_n ) ); println!(); println!( "AOV: loop sum: {}", bench_scaling_gen( |n: usize| { let vec = AppendOnlyVec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { let mut sum = 0; for i in 0..vec.len() { sum += vec[i]; } sum }, min_n ) ); println!( "RWV: loop sum: {}", bench_scaling_gen( |n: usize| { let vec = RwVec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { let mut sum = 0; for i in 0..vec.len() { sum += vec.get(i); } sum }, min_n ) ); println!( "plV: loop sum: {}", bench_scaling_gen( |n: usize| { let vec = ParkVec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { let mut sum = 0; for i in 0..vec.len() { sum += vec.get(i); } sum }, min_n ) ); println!( "Vec: loop sum: {}", bench_scaling_gen( |n: usize| { let mut vec = Vec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { let mut sum = 0; for i in 0..vec.len() { sum += vec[i]; } sum }, min_n ) ); println!(); println!( "AOV: back loop sum: {}", bench_scaling_gen( |n: usize| { let vec = AppendOnlyVec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { let mut sum = 0; let n = vec.len(); for i in 0..n { sum += vec[n - 1 - i]; } sum }, min_n ) ); println!( "RWV: back loop sum: {}", bench_scaling_gen( |n: usize| { let vec = RwVec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { let mut sum = 0; let n = vec.len(); for i in 0..n { sum += vec.get(n - 1 - i); } sum }, min_n ) ); println!( "plV: back loop sum: {}", bench_scaling_gen( |n: usize| { let vec = ParkVec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { let mut sum = 0; let n = vec.len(); for i in 0..n { sum += vec.get(n - 1 - i); } sum }, min_n ) ); println!( "Vec: back loop sum: {}", bench_scaling_gen( |n: usize| { let mut vec = Vec::new(); for i in 0..n { vec.push(i); } vec }, |vec| { let mut sum = 0; let n = vec.len(); for i in 0..n { sum += vec[n - 1 - i]; } sum }, min_n ) ); } println!(); }