diff --git a/src/compression/composite.rs b/src/compression/composite.rs index 731db2bee..6fbea54af 100644 --- a/src/compression/composite.rs +++ b/src/compression/composite.rs @@ -12,7 +12,7 @@ impl CompositeEncoder { pub fn new() -> CompositeEncoder { CompositeEncoder { block_encoder: SIMDBlockEncoder::new(), - output: Vec::new(), + output: Vec::with_capacity(500_000), } } @@ -56,11 +56,15 @@ impl CompositeDecoder { pub fn new() -> CompositeDecoder { CompositeDecoder { block_decoder: SIMDBlockDecoder::new(), - vals: Vec::new(), + vals: Vec::with_capacity(500_000), } } pub fn uncompress_sorted(&mut self, mut compressed_data: &[u8], doc_freq: usize) -> &[u32] { + if doc_freq > self.vals.capacity() { + let extra_capacity = doc_freq - self.vals.capacity(); + self.vals.reserve(extra_capacity); + } let mut offset = 0u32; self.vals.clear(); let num_blocks = doc_freq / NUM_DOCS_PER_BLOCK; @@ -86,3 +90,64 @@ impl CompositeDecoder { &self.vals } } + + +#[cfg(test)] +pub mod tests { + + use test::Bencher; + use super::*; + use compression::tests::generate_array; + + #[test] + fn test_composite_unsorted() { + let data = generate_array(10_000, 0.1); + let mut encoder = CompositeEncoder::new(); + let compressed = encoder.compress_unsorted(&data); + assert_eq!(compressed.len(), 19_790); + let mut decoder = CompositeDecoder::new(); + let result = decoder.uncompress_unsorted(&compressed, data.len()); + for i in 0..data.len() { + assert_eq!(data[i], result[i]); + } + } + + #[test] + fn test_composite_sorted() { + let data = generate_array(10_000, 0.1); + let mut encoder = CompositeEncoder::new(); + let compressed = encoder.compress_sorted(&data); + assert_eq!(compressed.len(), 7_822); + let mut decoder = CompositeDecoder::new(); + let result = decoder.uncompress_sorted(&compressed, data.len()); + for i in 0..data.len() { + assert_eq!(data[i], result[i]); + } + } + + + const BENCH_NUM_INTS: usize = 99_968; + + #[bench] + fn bench_compress(b: &mut Bencher) { + let mut encoder = CompositeEncoder::new(); + let data = generate_array(BENCH_NUM_INTS, 0.1); + b.iter(|| { + encoder.compress_sorted(&data); + }); + } + + #[bench] + fn bench_uncompress(b: &mut Bencher) { + let mut encoder = CompositeEncoder::new(); + let data = generate_array(BENCH_NUM_INTS, 0.1); + let compressed = encoder.compress_sorted(&data); + let mut decoder = CompositeDecoder::new(); + b.iter(|| { + decoder.uncompress_sorted(compressed, BENCH_NUM_INTS); + }); + } +} + + + diff --git a/src/compression/mod.rs b/src/compression/mod.rs index c5daf0688..344a7f7eb 100644 --- a/src/compression/mod.rs +++ b/src/compression/mod.rs @@ -8,6 +8,7 @@ pub use self::composite::CompositeEncoder; pub const NUM_DOCS_PER_BLOCK: usize = 128; + #[cfg(test)] pub mod tests { @@ -28,3 +29,5 @@ pub mod tests { generate_array_with_seed(n, ratio, 4) } } + + diff --git a/src/compression/simdcomp.rs b/src/compression/simdcomp.rs index 477a00667..98da3b551 100644 --- a/src/compression/simdcomp.rs +++ b/src/compression/simdcomp.rs @@ -177,6 +177,9 @@ impl SIMDBlockDecoder { mod tests { use super::*; + use test::Bencher; + use compression::NUM_DOCS_PER_BLOCK; + use compression::tests::generate_array; #[test] fn test_encode_sorted_block() { @@ -281,4 +284,29 @@ mod tests { } } + + #[bench] + fn bench_compress(b: &mut Bencher) { + let mut encoder = SIMDBlockEncoder::new(); + let data = generate_array(NUM_DOCS_PER_BLOCK, 0.1); + b.iter(|| { + encoder.compress_block_sorted(&data, 0u32); + }); + } + + #[bench] + fn bench_uncompress(b: &mut Bencher) { + let mut encoder = SIMDBlockEncoder::new(); + let data = generate_array(NUM_DOCS_PER_BLOCK, 0.1); + let compressed = encoder.compress_block_sorted(&data, 0u32); + let mut decoder = SIMDBlockDecoder::new(); + b.iter(|| { + decoder.uncompress_block_sorted(compressed, 0u32); + }); + } + } + + + + \ No newline at end of file