bench_static_vector.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // benchmark based on: http://cpp-next.com/archive/2010/10/howards-stl-move-semantics-benchmark/
  2. //
  3. // @file bench_static_vector.cpp
  4. // @date Aug 14, 2011
  5. // @author Andrew Hundt <ATHundt@gmail.com>
  6. //
  7. // (C) Copyright 2011-2013 Andrew Hundt <ATHundt@gmail.com>
  8. // (C) Copyright 2013-2013 Ion Gaztanaga
  9. //
  10. // Distributed under the Boost Software License, Version 1.0. (See
  11. // accompanying file LICENSE_1_0.txt or copy at
  12. // http://www.boost.org/LICENSE_1_0.txt)
  13. //
  14. // @brief varray_benchmark.cpp compares the performance of boost::container::varray to boost::container::vector
  15. #include "varray.hpp"
  16. #include "boost/container/vector.hpp"
  17. #include "boost/container/static_vector.hpp"
  18. #include "../test/movable_int.hpp"
  19. #include <vector>
  20. #include <iostream>
  21. #include <boost/timer/timer.hpp>
  22. #include <algorithm>
  23. #include <exception>
  24. using boost::timer::cpu_timer;
  25. using boost::timer::cpu_times;
  26. using boost::timer::nanosecond_type;
  27. static const std::size_t N = 500;
  28. #ifdef NDEBUG
  29. static const std::size_t Iter = 50;
  30. #else
  31. static const std::size_t Iter = 5;
  32. #endif
  33. //#define BENCH_SIMPLE_CONSTRUCTION
  34. //#define BENCH_TRIVIAL_TYPE
  35. #ifdef BENCH_TRIVIAL_TYPE
  36. typedef std::size_t basic_type_t;
  37. #else
  38. typedef boost::container::test::copyable_int basic_type_t;
  39. #endif
  40. template<typename T>
  41. T &get_set(std::size_t)
  42. {
  43. #ifdef BENCH_SIMPLE_CONSTRUCTION
  44. T &t = *new T(N);
  45. for (std::size_t i = 0; i < N; ++i)
  46. t[i] = basic_type_t(std::rand());
  47. #else
  48. T &t = *new T;
  49. t.reserve(N);
  50. for (std::size_t i = 0; i < N; ++i)
  51. t.push_back(basic_type_t(std::rand()));
  52. #endif
  53. return t;
  54. }
  55. template<typename T>
  56. T &generate()
  57. {
  58. T &v = *new T;
  59. v.reserve(N);
  60. for (std::size_t i = 0; i < N; ++i){
  61. typename T::reference r = get_set<typename T::value_type>(i);
  62. v.push_back(boost::move(r));
  63. delete &r;
  64. }
  65. return v;
  66. }
  67. template<typename T>
  68. cpu_times time_it()
  69. {
  70. cpu_timer sortTime,rotateTime,destructionTime;
  71. sortTime.stop();rotateTime.stop();destructionTime.stop();
  72. cpu_timer totalTime, constructTime;
  73. std::srand (0);
  74. for(std::size_t i = 0; i< Iter; ++i){
  75. constructTime.resume();
  76. {
  77. T &v = generate<T>();
  78. constructTime.stop();
  79. sortTime.resume();
  80. std::sort(v.begin(), v.end());
  81. sortTime.stop();
  82. rotateTime.resume();
  83. std::rotate(v.begin(), v.begin() + v.size()/2, v.end());
  84. rotateTime.stop();
  85. destructionTime.resume();
  86. delete &v;
  87. }
  88. destructionTime.stop();
  89. }
  90. totalTime.stop();
  91. std::cout << " construction took " << boost::timer::format(constructTime.elapsed(), 6, "%ws wall, %ts CPU (%p%)\n");
  92. std::cout << " sort took " << boost::timer::format(sortTime.elapsed(), 6, "%ws wall, %ts CPU (%p%)\n");
  93. std::cout << " rotate took " << boost::timer::format(rotateTime.elapsed(), 6, "%ws wall, %ts CPU (%p%)\n");
  94. std::cout << " destruction took " << boost::timer::format(destructionTime.elapsed(), 6, "%ws wall, %ts CPU (%p%)\n");
  95. std::cout << " Total time = " << boost::timer::format(totalTime.elapsed(), 6, "%ws wall, %ts CPU (%p%)\n") << std::endl;
  96. return totalTime.elapsed();
  97. }
  98. void compare_times(cpu_times time_numerator, cpu_times time_denominator){
  99. std::cout
  100. << "\n wall = " << ((double)time_numerator.wall/(double)time_denominator.wall)
  101. << "\n (user+sys) = " << ((double)(time_numerator.system+time_numerator.user)/(double)(time_denominator.system+time_denominator.user)) << "\n\n";
  102. }
  103. int main()
  104. {
  105. try {
  106. std::cout << "N = " << N << " Iter = " << Iter << "\n\n";
  107. std::cout << "varray benchmark:" << std::endl;
  108. cpu_times time_varray = time_it<boost::container::varray<boost::container::varray<basic_type_t,N>,N > >();
  109. std::cout << "boost::container::static_vector benchmark" << std::endl;
  110. cpu_times time_boost_static_vector = time_it<boost::container::static_vector<boost::container::static_vector<basic_type_t,N>,N > >();
  111. std::cout << "boost::container::vector benchmark" << std::endl;
  112. cpu_times time_boost_vector = time_it<boost::container::vector<boost::container::vector<basic_type_t> > >();
  113. std::cout << "std::vector benchmark" << std::endl;
  114. cpu_times time_standard_vector = time_it<std::vector<std::vector<basic_type_t> > >();
  115. std::cout << "varray/boost::container::vector total time comparison:";
  116. compare_times(time_varray, time_boost_vector);
  117. std::cout << "varray/boost::container::static_vector total time comparison:";
  118. compare_times(time_varray, time_boost_static_vector);
  119. std::cout << "varray/std::vector total time comparison:";
  120. compare_times(time_varray,time_standard_vector);
  121. }catch(std::exception &e){
  122. std::cout << e.what();
  123. }
  124. return 0;
  125. }