time_dynamic_xpressive.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. *
  3. * Copyright (c) 2002
  4. * John Maddock
  5. *
  6. * Use, modification and distribution are subject to the
  7. * Boost Software License, Version 1.0. (See accompanying file
  8. * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. *
  10. */
  11. #include "./regex_comparison.hpp"
  12. #include <cassert>
  13. #include <boost/timer.hpp>
  14. #include <boost/xpressive/xpressive.hpp>
  15. namespace dxpr
  16. {
  17. double time_match(const std::string& re, const std::string& text)
  18. {
  19. boost::xpressive::sregex e(boost::xpressive::sregex::compile(re, boost::xpressive::regex_constants::optimize));
  20. boost::xpressive::smatch what;
  21. boost::timer tim;
  22. int iter = 1;
  23. int counter, repeats;
  24. double result = 0;
  25. double run;
  26. assert(boost::xpressive::regex_match( text, what, e ));
  27. do
  28. {
  29. tim.restart();
  30. for(counter = 0; counter < iter; ++counter)
  31. {
  32. boost::xpressive::regex_match( text, what, e );
  33. }
  34. result = tim.elapsed();
  35. iter *= 2;
  36. } while(result < 0.5);
  37. iter /= 2;
  38. // repeat test and report least value for consistency:
  39. for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
  40. {
  41. tim.restart();
  42. for(counter = 0; counter < iter; ++counter)
  43. {
  44. boost::xpressive::regex_match( text, what, e );
  45. }
  46. run = tim.elapsed();
  47. result = (std::min)(run, result);
  48. }
  49. return result / iter;
  50. }
  51. struct noop
  52. {
  53. void operator()( boost::xpressive::smatch const & ) const
  54. {
  55. }
  56. };
  57. double time_find_all(const std::string& re, const std::string& text)
  58. {
  59. boost::xpressive::sregex e(boost::xpressive::sregex::compile(re, boost::xpressive::regex_constants::optimize));
  60. boost::xpressive::smatch what;
  61. boost::timer tim;
  62. int iter = 1;
  63. int counter, repeats;
  64. double result = 0;
  65. double run;
  66. do
  67. {
  68. tim.restart();
  69. for(counter = 0; counter < iter; ++counter)
  70. {
  71. boost::xpressive::sregex_iterator begin( text.begin(), text.end(), e ), end;
  72. std::for_each( begin, end, noop() );
  73. }
  74. result = tim.elapsed();
  75. iter *= 2;
  76. }while(result < 0.5);
  77. iter /= 2;
  78. if(result >10)
  79. return result / iter;
  80. // repeat test and report least value for consistency:
  81. for(repeats = 0; repeats < REPEAT_COUNT; ++repeats)
  82. {
  83. tim.restart();
  84. for(counter = 0; counter < iter; ++counter)
  85. {
  86. boost::xpressive::sregex_iterator begin( text.begin(), text.end(), e ), end;
  87. std::for_each( begin, end, noop() );
  88. }
  89. run = tim.elapsed();
  90. result = (std::min)(run, result);
  91. }
  92. return result / iter;
  93. }
  94. }