diff options
Diffstat (limited to 'src/boost/libs/convert/test/performance_spirit.cpp')
-rw-r--r-- | src/boost/libs/convert/test/performance_spirit.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/src/boost/libs/convert/test/performance_spirit.cpp b/src/boost/libs/convert/test/performance_spirit.cpp new file mode 100644 index 00000000..4878b07d --- /dev/null +++ b/src/boost/libs/convert/test/performance_spirit.cpp @@ -0,0 +1,112 @@ +// Boost.Convert test and usage example +// Copyright (c) 2009-2016 Vladimir Batov. +// Use, modification and distribution are subject to the Boost Software License, +// Version 1.0. See http://www.boost.org/LICENSE_1_0.txt. + +// This code has been adapted from libs/spirit/optimization/qi/int_parser.cpp. +// This code uses the performance testing framework from libs/spirit/optimization/measure.cpp. +// See these mentioned files for the copyright notice. + +#include "./test.hpp" + +#if defined(BOOST_CONVERT_IS_NOT_SUPPORTED) +int main(int, char const* []) { return 0; } +#else + +#include <boost/convert.hpp> +#include <boost/convert/spirit.hpp> +#include <boost/convert/strtol.hpp> +#include <boost/convert/lexical_cast.hpp> +#include "./prepare.hpp" + +//#define main() old_str_to_int_test_spirit() +//#include <libs/spirit/optimization/qi/int_parser.cpp> +#include <libs/spirit/workbench/measure.hpp> +#include <string> +#include <vector> +#include <cstdlib> +#include <boost/spirit/include/qi.hpp> + +namespace +{ + namespace local + { + struct base : test::base + { + base() : strings_(local::get_strs()) {} + + // Test strings are created as part of the object, i.e. on the stack to make sure + // they are easily accessed. + local::strings strings_; + }; + } + struct raw_lxcast_str_to_int_test : local::base + { + void benchmark() + { + for (size_t i = 0; i < strings_.size(); ++i) + this->val += boost::lexical_cast<int>(strings_[i].c_str()); + } + }; + struct cnv_lxcast_str_to_int_test : local::base + { + void benchmark() + { + for (size_t i = 0; i < strings_.size(); ++i) + this->val += boost::convert<int>(strings_[i].c_str(), cnv).value(); + } + boost::cnv::lexical_cast cnv; + }; + struct raw_spirit_str_to_int_test : local::base + { + static int parse(char const* str) + { + char const* beg = str; + char const* end = beg + strlen(str); + int n; + + if (boost::spirit::qi::parse(beg, end, boost::spirit::qi::int_, n)) + if (beg == end) + return n; + + return (BOOST_ASSERT(0), 0); + } + void benchmark() + { + for (size_t i = 0; i < strings_.size(); ++i) + this->val += parse(strings_[i].c_str()); + } + }; + struct cnv_spirit_str_to_int_test : local::base + { + void benchmark() + { + for (size_t i = 0; i < strings_.size(); ++i) + this->val += boost::convert<int>(strings_[i].c_str(), cnv).value(); + } + boost::cnv::spirit cnv; + }; +} + +int +main(int, char const* []) +{ + // This code has been adapted from libs/spirit/optimization/qi/int_parser.cpp. + // This code uses the performance testing framework from libs/spirit/optimization/measure.cpp. + // See these mentioned files for the copyright notice. + + BOOST_SPIRIT_TEST_BENCHMARK( + 10000000, // This is the maximum repetitions to execute + (raw_lxcast_str_to_int_test) + (cnv_lxcast_str_to_int_test) + (raw_spirit_str_to_int_test) + (cnv_spirit_str_to_int_test) + ) + + // This is ultimately responsible for preventing all the test code + // from being optimized away. Change this to return 0 and you + // unplug the whole test's life support system. + return test::live_code != 0; +} + +#endif |