/*============================================================================= Copyright (c) 2001-2010 Joel de Guzman Distributed under the Boost Software License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) ==============================================================================*/ #include "../measure.hpp" #include #include #include #include namespace { /////////////////////////////////////////////////////////////////////////// // Generate a random number string with N digits std::string gen_int(int digits) { std::string result; if (rand()%2) // Prepend a '-' result += '-'; result += '1' + (rand()%9); // The first digit cannot be '0' for (int i = 1; i < digits; ++i) // Generate the remaining digits result += '0' + (rand()%10); return result; } std::string numbers[9]; char const* first[9]; char const* last[9]; /////////////////////////////////////////////////////////////////////////// struct atoi_test : test::base { void benchmark() { for (int i = 0; i < 9; ++i) this->val += atoi(first[i]); } }; /////////////////////////////////////////////////////////////////////////// struct strtol_test : test::base { void benchmark() { for (int i = 0; i < 9; ++i) this->val += strtol(first[i], const_cast(&last[i]), 10); } }; /////////////////////////////////////////////////////////////////////////// struct spirit_int_test : test::base { static int parse(char const* first, char const* last) { int n; namespace qi = boost::spirit::qi; using qi::int_; qi::parse(first, last, int_, n); return n; } void benchmark() { for (int i = 0; i < 9; ++i) this->val += parse(first[i], last[i]); } }; } int main() { // Seed the random generator srand(time(0)); // Generate random integers with 1 .. 9 digits // We test only 9 digits to avoid overflow std::cout << "///////////////////////////////////////////////////////////////////////////" << std::endl; std::cout << "Numbers to test:" << std::endl; for (int i = 0; i < 9; ++i) { numbers[i] = gen_int(i+1); first[i] = numbers[i].c_str(); last[i] = first[i]; while (*last[i]) last[i]++; std::cout << i+1 << " digit number:" << numbers[i] << std::endl; } std::cout << "///////////////////////////////////////////////////////////////////////////" << std::endl; BOOST_SPIRIT_TEST_BENCHMARK( 10000000, // This is the maximum repetitions to execute (atoi_test) (strtol_test) (spirit_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; }