Guest User

Untitled

a guest
May 25th, 2018
91
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.62 KB | None | 0 0
  1. #![feature(asm)]
  2. #![feature(test)]
  3.  
  4. #[derive(Default)]
  5. struct A {
  6. data: Vec<u8>,
  7. }
  8.  
  9. impl A {
  10. fn find_or_insert_unsafe(&mut self, x: &u8) -> &u8 {
  11. if let Some(n) = self
  12. .data
  13. .iter()
  14. .enumerate()
  15. .find(|&(_, i)| i == x)
  16. .map(|(n, _)| n)
  17. {
  18. unsafe { self.data.get_unchecked(n) }
  19. } else {
  20. self.data.push(*x);
  21. self.data.last().unwrap()
  22. }
  23. }
  24. fn find_or_insert(&mut self, x: &u8) -> &u8 {
  25. if let Some(n) = self
  26. .data
  27. .iter()
  28. .enumerate()
  29. .find(|&(_, i)| i == x)
  30. .map(|(n, _)| n)
  31. {
  32. &self.data[n]
  33. } else {
  34. self.data.push(*x);
  35. self.data.last().unwrap()
  36. }
  37. }
  38. }
  39.  
  40. #[cfg(test)]
  41. mod test {
  42. use super::*;
  43. extern crate test;
  44. use self::test::Bencher;
  45.  
  46. #[inline(never)]
  47. fn black_box<T>(dummy: T) -> T {
  48. unsafe { asm!("" : : "r"(&dummy)) }
  49. dummy
  50. }
  51.  
  52. #[inline(never)]
  53. fn a() -> A {
  54. let mut a = black_box(A{data: black_box(vec![1; 1_000_000])});
  55. a.data[999_999] = 77;
  56. a
  57. }
  58.  
  59. #[bench]
  60. fn bench_safe(b: &mut Bencher) {
  61. let mut a = a();
  62. b.iter(|| {
  63. let c = a.find_or_insert(&77);
  64. black_box(c);
  65. });
  66. //println!("{:?}", b.bench().sum);
  67. }
  68. #[bench]
  69. fn bench_unsafe(b: &mut Bencher) {
  70. let mut a = a();
  71. b.iter(|| {
  72. let c = a.find_or_insert_unsafe(&77);
  73. black_box(c);
  74. });
  75. //println!("{:?}", b.bench().sum);
  76. }
  77. }
Add Comment
Please, Sign In to add comment