1#![cfg_attr(feature = "bench", feature(test))]
2
3#[cfg(feature = "bench")]
4extern crate test;
5
6
7use byteorder::{WriteBytesExt, ReadBytesExt, NativeEndian};
8use serde::{Serialize,Deserialize};
9use serde_json;
10use std::borrow::Cow;
11
12
13pub struct Position {
43 pub offset: i32,
44 pub length: i32,
45}
46
47
48#[derive(Debug)]
59pub enum MemBufferTypes {
60 Text,
61 Integer32,
62 VectorU8,
63 VectorU64,
64 MemBuffer,
65 LastPreDefienedValue
66}
67
68impl Into<i32> for MemBufferTypes {
69 fn into(self) -> i32 {
70 self as i32
71 }
72}
73
74
75struct InternPosition {
76 pub pos: Position,
77 pub variable_type: i32,
78}
79
80
81
82
83#[derive(Debug, Clone)]
84pub enum MemBufferError {
85 FieldTypeError(i32,i32),
86 WrongFormat,
87}
88
89impl<'a> std::fmt::Display for MemBufferError {
90 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
91 match self {
92 MemBufferError::FieldTypeError(x,y) => write!(f,"Memory buffer error: Field has type {} and not requested type {}",x.to_string(),y.to_string()),
93 MemBufferError::WrongFormat => write!(f,"Memory buffer error: Reached end of slice before end of header, memory seems to be corrupted")
94 }
95 }
96}
97
98
99pub trait MemBufferDeserialize<'a,T> {
100 fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<T,MemBufferError> where Self: Sized;
101}
102
103impl<'a> MemBufferDeserialize<'a,&'a str> for &str {
104 fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<&'a str,MemBufferError> {
105 unsafe{ Ok(std::str::from_utf8_unchecked(&mem[pos.offset as usize..(pos.offset+pos.length) as usize])) }
108 }
109}
110
111impl<'a> MemBufferDeserialize<'a,i32> for i32 {
112 fn from_mem_buffer(pos: &Position, _: &'a [u8]) -> Result<i32,MemBufferError> {
113 Ok(pos.offset)
115 }
116}
117
118impl<'a> MemBufferDeserialize<'a,&'a [u8]> for &[u8] {
119 fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<&'a [u8],MemBufferError> {
120 Ok(&mem[pos.offset as usize..(pos.offset+pos.length) as usize])
121 }
122}
123
124impl<'a> MemBufferDeserialize<'a,&'a [u64]> for &[u64] {
125 fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<&'a [u64],MemBufferError> {
126 let val: *const u8 = mem[pos.offset as usize..].as_ptr();
127 let cast_memory = val.cast::<u64>();
128 let mem_length = pos.length>>3;
130
131 Ok(unsafe{std::slice::from_raw_parts(cast_memory, mem_length as usize)})
133 }
134}
135
136impl<'a> MemBufferDeserialize<'a,MemBufferReader<'a>> for MemBufferReader<'a> {
137 fn from_mem_buffer(pos: &Position, mem: &'a [u8]) -> Result<MemBufferReader<'a>,MemBufferError> {
138 let reader = MemBufferReader::new(&mem[pos.offset as usize..(pos.offset+pos.length) as usize])?;
139 Ok(reader)
140 }
141}
142
143pub struct MemBufferReader<'a> {
158 offsets: &'a [InternPosition],
159 data: &'a [u8]
160}
161
162impl<'a> MemBufferReader<'a> {
163 pub fn deserialize_i32_from(mut buffer: &[u8]) -> i32 {
165 buffer.read_i32::<NativeEndian>().unwrap()
166 }
167
168 pub fn len(&self) -> usize {
169 self.offsets.len()
170 }
171
172 pub fn payload_len(&self) -> usize {
173 self.data.len()
174 }
175
176 fn intern_load_entry<X: MemBufferDeserialize<'a,X>>(&self, key: usize, expected_type: i32) -> Result<X,MemBufferError> {
179 let entry = &self.offsets[key];
180 let is_type = entry.variable_type;
181 if is_type != expected_type {
182 return Err(MemBufferError::FieldTypeError(is_type,expected_type));
183 }
184 return X::from_mem_buffer(&entry.pos, self.data);
185 }
186
187 pub fn load_entry<X: MemBufferDeserialize<'a,X> + MemBufferSerialize>(&self,key: usize) -> Result<X,MemBufferError> {
191 self.intern_load_entry(key.into(), X::get_mem_buffer_type())
192 }
193
194 pub fn load_serde_entry<T: Deserialize<'a>>(&self,key: usize) -> Result<T,MemBufferError> {
196 let string : &str = self.load_entry(key.into())?;
197 Ok(serde_json::from_str(string).unwrap())
198 }
199
200 pub fn load_recursive_reader(&self, key: usize) -> Result<MemBufferReader<'a>,MemBufferError> {
202 self.intern_load_entry(key.into(), MemBufferWriter::get_mem_buffer_type())
203 }
204
205
206 pub fn new(val: &'a [u8]) -> Result<MemBufferReader<'a>,MemBufferError> {
209 if val.len() < 8 {
210 return Err(MemBufferError::WrongFormat);
211 }
212
213 let vec_len = MemBufferReader::deserialize_i32_from(val) as usize;
214 let start = vec_len*std::mem::size_of::<InternPosition>()+4;
215 if val.len() < start+4 {
216 return Err(MemBufferError::WrongFormat);
217 }
218
219 let magic = MemBufferReader::deserialize_i32_from(&val[start..]);
220 if magic != 0x7AFECAFE {
221 return Err(MemBufferError::WrongFormat);
222 }
223 unsafe {
224 Ok(MemBufferReader {
225 offsets: std::slice::from_raw_parts(val[4..].as_ptr().cast::<InternPosition>(),vec_len),
226 data: &val[start+4..]
227 })
228 }
229 }
230}
231
232impl<'a> std::fmt::Debug for MemBufferReader<'a> {
233 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
234 write!(f,"Found memory buffer with payload size {}",self.data.len())
235 }
236}
237
238
239pub struct MemBufferWriter {
241 offsets: Vec<InternPosition>,
242 data: Vec<u8>
243}
244
245pub trait MemBufferSerialize {
246 fn to_mem_buffer<'a>(&'a self, pos: &mut Position) -> std::borrow::Cow<'a,[u8]>;
247 fn get_mem_buffer_type() -> i32;
248}
249
250impl MemBufferSerialize for &str {
251 fn to_mem_buffer<'a>(&'a self, _ : &mut Position) -> std::borrow::Cow<'a,[u8]> {
252 std::borrow::Cow::Borrowed(self.as_bytes())
253 }
254
255 fn get_mem_buffer_type() -> i32 {
256 MemBufferTypes::Text.into()
257 }
258}
259
260impl MemBufferSerialize for &String {
261 fn to_mem_buffer<'a>(&'a self, _ : &mut Position) -> Cow<'a,[u8]> {
262 Cow::Borrowed(self.as_bytes())
263 }
264
265 fn get_mem_buffer_type() -> i32 {
266 MemBufferTypes::Text.into()
267 }
268}
269
270impl MemBufferSerialize for i32 {
271 fn to_mem_buffer<'a>(&'a self, pos: &mut Position) -> Cow<'a, [u8]> {
272 pos.offset = *self;
273 Cow::Borrowed(&[])
274 }
275
276 fn get_mem_buffer_type() -> i32 {
277 MemBufferTypes::Integer32.into()
278 }
279}
280
281impl MemBufferSerialize for &[u8] {
282 fn to_mem_buffer<'a>(&'a self, _: &mut Position) -> Cow<'a, [u8]> {
283 Cow::Borrowed(self)
284 }
285
286 fn get_mem_buffer_type() -> i32 {
287 MemBufferTypes::VectorU8.into()
288 }
289}
290
291impl MemBufferSerialize for &[u64] {
292 fn to_mem_buffer<'a>(&'a self, _: &mut Position) -> Cow<'a,[u8]> {
293 let val: *const u64 = self.as_ptr();
294 let cast_memory = val.cast::<u8>();
295 let mem_length = self.len() * std::mem::size_of::<u64>();
296 Cow::Borrowed(unsafe{ std::slice::from_raw_parts(cast_memory, mem_length)})
297 }
298
299 fn get_mem_buffer_type() -> i32 {
300 MemBufferTypes::VectorU64.into()
301 }
302}
303
304
305impl MemBufferSerialize for MemBufferWriter {
306 fn to_mem_buffer<'a>(&'a self, _ : &mut Position) -> Cow<'a,[u8]> {
307 let ret = self.finalize();
308 Cow::Owned(ret)
309 }
310
311 fn get_mem_buffer_type() -> i32 {
312 MemBufferTypes::MemBuffer.into()
313 }
314}
315
316impl MemBufferWriter {
317 pub fn new() -> MemBufferWriter {
319 MemBufferWriter {
320 offsets: Vec::new(),
321 data: Vec::new()
322 }
323 }
324
325 pub fn from<'a>(raw_memory: &'a [u8]) -> Result<MemBufferWriter,MemBufferError> {
351 let reader = MemBufferReader::new(raw_memory)?;
352 let mut offsets : Vec<InternPosition> = Vec::new();
353 for x in reader.offsets.iter() {
354 offsets.push(InternPosition{
355 pos: Position {
356 offset: x.pos.offset,
357 length: x.pos.length,
358 },
359 variable_type: x.variable_type
360 });
361 }
362
363 Ok(MemBufferWriter {
364 offsets,
365 data: reader.data.to_vec()
366 })
367 }
368
369 pub fn serialize_i32_to(val: i32, to: &mut Vec<u8>) {
371 to.write_i32::<NativeEndian>(val).unwrap();
372 }
373
374 pub fn add_entry<T: MemBufferSerialize>(&mut self, val: T) {
376 let mut position = Position {offset: self.data.len() as i32, length: 0};
377 let slice = val.to_mem_buffer(&mut position);
378 position.length = slice.len() as i32;
379 self.offsets.push(InternPosition{pos:position,variable_type: T::get_mem_buffer_type()});
380 self.data.extend_from_slice(&slice);
381 }
382
383 pub fn add_serde_entry<T: Serialize>(&mut self,val: &T) {
386 let as_str = serde_json::to_string(val).unwrap();
387 self.add_entry(&as_str);
388 }
389
390
391 pub fn finalize(&self) -> Vec<u8> {
393 let mut var: Vec<u8> = Vec::with_capacity(self.data.len()+self.offsets.len()*20);
394 MemBufferWriter::serialize_i32_to(self.offsets.len() as i32,&mut var);
395 for val in self.offsets.iter() {
396 MemBufferWriter::serialize_i32_to(val.pos.offset, &mut var);
397 MemBufferWriter::serialize_i32_to(val.pos.length, &mut var);
398 MemBufferWriter::serialize_i32_to(val.variable_type, &mut var);
399 }
400 MemBufferWriter::serialize_i32_to(0x7AFECAFE, &mut var);
401 var.extend_from_slice(&self.data);
402 var
403 }
404}
405
406
407
408#[cfg(test)]
409mod tests {
410 use super::{MemBufferWriter,MemBufferReader,MemBufferError,MemBufferTypes,MemBufferSerialize};
411 use serde::{Serialize,Deserialize};
412
413 #[derive(Serialize,Deserialize)]
414 struct HeavyStruct {
415 vec: Vec<u64>,
416 name: String,
417 frequency: i32,
418 id: i32,
419 }
420
421 #[test]
422 fn check_enum_usage() {
423 let mut writer = MemBufferWriter::new();
424 writer.add_entry("Der moderne Prometheus");
425 writer.add_entry("Dies hier ist nur ein Satz");
426 writer.add_entry::<&[u64]>(&vec![0,1,2,3,4,5]);
427
428 let result = writer.finalize();
429
430 let reader = MemBufferReader::new(&result).unwrap();
431
432 let _: &str = reader.load_entry(0).unwrap();
433 let _: &str = reader.load_entry(1).unwrap();
434 let _: &[u64] = reader.load_entry(2).unwrap();
435 }
436
437 #[test]
438 fn check_type_ids() {
439 assert_eq!(<&str as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::Text as i32);
440 assert_eq!(<&String as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::Text as i32);
441 assert_eq!(<i32 as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::Integer32 as i32);
442 assert_eq!(<&[u8] as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::VectorU8 as i32);
443 assert_eq!(<&[u64] as MemBufferSerialize>::get_mem_buffer_type(),MemBufferTypes::VectorU64 as i32);
444 assert_eq!(MemBufferWriter::get_mem_buffer_type(),MemBufferTypes::MemBuffer as i32);
445 }
446
447 #[test]
448 fn corrupt_length() {
449 let mut writer = MemBufferWriter::new();
450 writer.add_entry("Der moderne Prometheus");
451 writer.add_entry("Dies hier ist nur ein Satz");
452 writer.add_entry::<&[u64]>(&vec![0,1,2,3,4,5]);
453
454 let mut result = writer.finalize();
455 result[0] = 100;
456
457
458 let reader = MemBufferReader::new(&result);
459 assert_eq!(reader.is_err(),true);
460 }
461
462 #[test]
463 fn check_read_attributes() {
464 let mut writer = MemBufferWriter::new();
465 let str1 = "Hello World";
466 let str2 = "Hello second World";
467 let str3 = "визитной карточкой";
468 writer.add_entry(str1);
469 writer.add_entry(str2);
470 writer.add_entry(str3);
471 let result = writer.finalize();
472
473 let reader = MemBufferReader::new(&result).unwrap();
474 let positions = &reader.offsets;
475
476 assert_eq!(positions.len(),3);
477 let zero = &positions[0];
478 assert_eq!(zero.variable_type,MemBufferTypes::Text as i32);
479 assert_eq!(zero.pos.offset,0);
480 assert_eq!(zero.pos.length,str1.as_bytes().len() as i32);
481
482 let one = &positions[1];
483 assert_eq!(one.variable_type,MemBufferTypes::Text as i32);
484 assert_eq!(one.pos.offset,str1.as_bytes().len() as i32);
485 assert_eq!(one.pos.length,str2.as_bytes().len() as i32);
486
487 let two = &positions[2];
488 assert_eq!(two.variable_type,MemBufferTypes::Text as i32);
489 assert_eq!(two.pos.offset as usize,str1.as_bytes().len() + str2.as_bytes().len());
490 assert_eq!(two.pos.length,str3.as_bytes().len() as i32);
491
492 assert_eq!(reader.load_entry::<&str>(2).unwrap(),str3);
493 }
494
495 #[test]
496 fn check_serde_capability() {
497 let value = HeavyStruct {
498 vec: vec![100,20,1],
499 name: String::from("membuffer!"),
500 frequency: 10,
501 id: 200,
502 };
503 let mut writer = MemBufferWriter::new();
504 writer.add_serde_entry(&value);
505 let result = writer.finalize();
506
507 let reader = MemBufferReader::new(&result).unwrap();
508 let struc: HeavyStruct = reader.load_serde_entry(0).unwrap();
509
510 assert_eq!(struc.vec, vec![100,20,1]);
511 assert_eq!(struc.name,"membuffer!");
512 assert_eq!(struc.frequency,10);
513 assert_eq!(struc.id,200);
514 }
515
516 #[test]
517 fn check_serialize_string_deserialize() {
518 let mut writer = MemBufferWriter::new();
519 writer.add_entry("Earth");
520 let result = writer.finalize();
521
522 let reader = MemBufferReader::new(&result).unwrap();
523 assert_eq!(reader.load_entry::<&str>(0).unwrap(), "Earth");
524 }
525
526 #[test]
527 fn check_serialize_vecu8_deserialize() {
528 let mut writer = MemBufferWriter::new();
529 let some_bytes : Vec<u8> = vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10];
530 writer.add_entry(&some_bytes[..]);
531 let result = writer.finalize();
532
533 let reader = MemBufferReader::new(&result).unwrap();
534 assert_eq!(reader.load_entry::<&[u8]>(0).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
535 }
536
537 #[should_panic]
538 #[test]
539 fn check_wrong_key() {
540 let mut writer = MemBufferWriter::new();
541 let some_bytes : Vec<u64> = vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10];
542 writer.add_entry(&some_bytes[..]);
543 writer.add_entry(&some_bytes[..]);
544 let result = writer.finalize();
545
546 let reader = MemBufferReader::new(&result).unwrap();
547 assert_eq!(reader.load_entry::<&[u64]>(0).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
548 assert_eq!(reader.load_entry::<&[u64]>(3).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
550 }
551
552 #[test]
553 fn check_reload_writer_from_mem() {
554 let mut writer = MemBufferWriter::new();
555 let str1 = "Hello World";
556 let str2 = "Hello second World";
557 let str3 = "визитной карточкой";
558 writer.add_entry(str1);
559 writer.add_entry(str2);
560 writer.add_entry(str3);
561 let result = writer.finalize();
562
563 let mut writer2 = MemBufferWriter::from(&result).unwrap();
564 writer2.add_entry("fuchs");
565
566 let added2 = writer2.finalize();
567 let reader = MemBufferReader::new(&added2).unwrap();
568 assert_eq!(reader.len(),4);
569 assert_eq!(reader.load_entry::<&str>(3).unwrap(),"fuchs");
570 assert_eq!(reader.load_entry::<&str>(2).unwrap(),"визитной карточкой");
571 }
572
573 #[test]
574 fn check_serialize_vecu64_deserialize() {
575 let mut writer = MemBufferWriter::new();
576 let some_bytes : Vec<u64> = vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10];
577 writer.add_entry(&some_bytes[..]);
578 writer.add_entry(&some_bytes[..]);
579 let result = writer.finalize();
580
581 let reader = MemBufferReader::new(&result).unwrap();
582 assert_eq!(reader.load_entry::<&[u64]>(0).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
583 assert_eq!(reader.load_entry::<&[u64]>(1).unwrap(), vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10]);
584 }
585
586
587 #[test]
588 fn check_len() {
589 let mut writer = MemBufferWriter::new();
590 let some_bytes : Vec<u64> = vec![100,200,100,200,1,2,3,4,5,6,7,8,9,10];
591 writer.add_entry(&some_bytes[..]);
592 writer.add_entry(&some_bytes[..]);
593 writer.add_entry(&some_bytes[..]);
594 let result = writer.finalize();
595
596 let reader = MemBufferReader::new(&result).unwrap();
597 assert_eq!(reader.len(), 3);
598 }
599
600 #[test]
601 fn check_empty() {
602 let writer = MemBufferWriter::new();
603 let result = writer.finalize();
604 let reader = MemBufferReader::new(&result).unwrap();
605 assert_eq!(reader.len(), 0);
606 assert_eq!("Found memory buffer with payload size 0",format!("{:?}",reader));
607
608 }
609
610 #[test]
611 fn check_slice_too_small() {
612 let writer = MemBufferWriter::new();
613 let result = writer.finalize();
614 let reader = MemBufferReader::new(&result[0..1]);
615 assert_eq!(reader.is_err(),true);
616 println!("Error: {}",reader.unwrap_err());
617 }
618
619
620 #[test]
621 fn check_payload_len() {
622 let mut writer = MemBufferWriter::new();
623 let some_bytes = "Hello how are you?";
624 writer.add_entry(&some_bytes[..]);
625 writer.add_entry(&some_bytes[..]);
626 writer.add_entry(&some_bytes[..]);
627 let result = writer.finalize();
628
629 let reader = MemBufferReader::new(&result).unwrap();
630 assert_eq!(reader.payload_len(), some_bytes.as_bytes().len()*3);
631 }
632
633 #[test]
634 fn check_recursive_readers() {
635 let mut writer = MemBufferWriter::new();
636 let some_bytes = "Hello how are you?";
637 writer.add_entry(&some_bytes[..]);
638
639 let mut writer2 = MemBufferWriter::new();
640 writer2.add_entry(some_bytes);
641
642 writer.add_entry(writer2);
643 let result = writer.finalize();
644 assert_eq!(writer.finalize(), result);
645
646 let reader = MemBufferReader::new(&result).unwrap();
647 assert_eq!(reader.len(), 2);
648 assert_eq!(reader.load_entry::<&str>(0).unwrap(), "Hello how are you?");
649 let second = reader.load_recursive_reader(1);
650 assert_eq!(second.is_err(),false);
651 let reader2 = second.unwrap();
652 assert_eq!(reader2.len(), 1);
653 assert_eq!(reader2.load_entry::<&str>(0).unwrap(), "Hello how are you?");
654
655 assert_eq!(reader.load_recursive_reader(0).is_err(),true);
656 }
657
658 #[test]
659 fn check_mem_shift() {
660 let mut writer = MemBufferWriter::new();
661 writer.add_entry("Earth");
662 let result = writer.finalize();
663
664 let reader = MemBufferReader::new(&result[1..]);
665 assert_eq!(reader.is_err(),true);
666 }
667
668 #[test]
669 fn check_type_error() {
670 let mut writer = MemBufferWriter::new();
671 writer.add_entry("Earth");
672 let result = writer.finalize();
673
674 let reader = MemBufferReader::new(&result);
675 assert_eq!(reader.is_err(),false);
676 let err = reader.unwrap().load_entry::<i32>(0).unwrap_err();
677 if let MemBufferError::FieldTypeError(x,y) = err {
678 println!("Error {} ",MemBufferError::FieldTypeError(x,y));
679 assert_eq!(x, MemBufferTypes::Text as i32);
680 assert_eq!(y, MemBufferTypes::Integer32 as i32);
681 }
682 }
683
684
685 #[test]
686 fn check_serialize_i32_deserialize() {
687 let mut writer = MemBufferWriter::new();
688 writer.add_entry(100);
689 let result = writer.finalize();
690
691 let reader = MemBufferReader::new(&result).unwrap();
692 assert_eq!(reader.load_entry::<i32>(0).unwrap(), 100);
693 }
694}
695
696#[cfg(feature="bench")]
697mod bench {
698 use test::Bencher;
699 use super::{MemBufferWriter,MemBufferReader};
700 use serde::{Serialize,Deserialize};
701 use serde_json;
702
703
704 #[bench]
705 fn benchmark_few_keys_payload_1mb(b: &mut Bencher) {
706 let mut huge_string = String::with_capacity(1_000_000);
707 for _ in 0..1_000_000 {
708 huge_string.push('a');
709 }
710 let mut writer = MemBufferWriter::new();
711 writer.add_entry(&huge_string);
712 let result = writer.finalize();
713
714 b.iter(|| {
715 let reader = MemBufferReader::new(&result).unwrap();
716 let string = reader.load_entry::<&str>(0).unwrap();
717 assert_eq!(string.len(), 1_000_000);
718 });
719 }
720
721 #[bench]
722 fn benchmark_few_keys_payload_10mb(b: &mut Bencher) {
723 let mut huge_string = String::with_capacity(10_000_000);
724 for _ in 0..10_000_000 {
725 huge_string.push('a');
726 }
727 let mut writer = MemBufferWriter::new();
728 writer.add_entry(&huge_string);
729 let result = writer.finalize();
730
731 b.iter(|| {
732 let reader = MemBufferReader::new(&result).unwrap();
733 let string = reader.load_entry::<&str>(0).unwrap();
734 assert_eq!(string.len(), 10_000_000);
735 });
736 }
737
738 #[bench]
739 fn benchmark_few_keys_payload_100mb(b: &mut Bencher) {
740 let mut huge_string = String::with_capacity(10_000_000);
741 for _ in 0..100_000_000 {
742 huge_string.push('a');
743 }
744 let mut writer = MemBufferWriter::new();
745 writer.add_entry(&huge_string);
746 let result = writer.finalize();
747
748 b.iter(|| {
749 let reader = MemBufferReader::new(&result).unwrap();
750 let string = reader.load_entry::<&str>(0).unwrap();
751 assert_eq!(string.len(), 100_000_000);
752 });
753 }
754
755 #[bench]
756 fn benchmark_few_keys_payload_1mb_times_3(b: &mut Bencher) {
757 let mut huge_string = String::with_capacity(1_000_000);
758 for _ in 0..1_000_000 {
759 huge_string.push('a');
760 }
761 let mut writer = MemBufferWriter::new();
762 writer.add_entry(&huge_string);
763 writer.add_entry(&huge_string);
764 writer.add_entry(&huge_string);
765 let result = writer.finalize();
766 assert!(result.len() > 3_000_000);
767
768 b.iter(|| {
769 let reader = MemBufferReader::new(&result).unwrap();
770 let string1 = reader.load_entry::<&str>(0).unwrap();
771 let string2 = reader.load_entry::<&str>(1).unwrap();
772 let string3 = reader.load_entry::<&str>(2).unwrap();
773 assert_eq!(string1.len(), 1_000_000);
774 assert_eq!(string2.len(), 1_000_000);
775 assert_eq!(string3.len(), 1_000_000);
776 });
777 }
778
779 #[bench]
780 fn benchmark_few_keys_payload_100mb_times_3(b: &mut Bencher) {
781 let mut huge_string = String::with_capacity(100_000_000);
782 for _ in 0..100_000_000 {
783 huge_string.push('a');
784 }
785 let mut writer = MemBufferWriter::new();
786 writer.add_entry(&huge_string);
787 writer.add_entry(&huge_string);
788 writer.add_entry(&huge_string);
789 let result = writer.finalize();
790 assert!(result.len() > 300_000_000);
791
792 b.iter(|| {
793 let reader = MemBufferReader::new(&result).unwrap();
794 let string1 = reader.load_entry::<&str>(0).unwrap();
795 let string2 = reader.load_entry::<&str>(1).unwrap();
796 let string3 = reader.load_entry::<&str>(2).unwrap();
797 assert_eq!(string1.len(), 100_000_000);
798 assert_eq!(string2.len(), 100_000_000);
799 assert_eq!(string3.len(), 100_000_000);
800 });
801 }
802
803 #[derive(Serialize,Deserialize)]
804 struct BenchSerde<'a> {
805 one: &'a str,
806 two: &'a str,
807 three: &'a str
808 }
809
810 #[bench]
811 fn benchmark_few_keys_payload_1mb_times_3_serde(b: &mut Bencher) {
812 let mut huge_string = String::with_capacity(1_000_000);
813 for _ in 0..1_000_000 {
814 huge_string.push('a');
815 }
816 let first = BenchSerde {
817 one: &huge_string,
818 two: &huge_string,
819 three: &huge_string
820 };
821
822 let string = serde_json::to_string(&first).unwrap();
823
824 b.iter(|| {
825 let reader: BenchSerde = serde_json::from_str(&string).unwrap();
826 assert_eq!(reader.one.len(), 1_000_000);
827 assert_eq!(reader.two.len(), 1_000_000);
828 assert_eq!(reader.three.len(), 1_000_000);
829 });
830 }
831}