// Copyright (c) 2001-2010 Hartmut Kaiser // // 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 #include #include #include #include #include #include "../high_resolution_timer.hpp" using namespace std; using namespace boost::spirit; #define MAX_ITERATION 10000000 /////////////////////////////////////////////////////////////////////////////// struct random_fill { double operator()() const { double scale = std::rand() / 100 + 1; return double(std::rand() * std::rand()) / scale; } }; /////////////////////////////////////////////////////////////////////////////// int main() { namespace karma = boost::spirit::karma; char buffer[512]; // we don't expect more than 512 bytes to be generated cout << "Converting " << MAX_ITERATION << " randomly generated double values to strings." << flush << endl; std::srand(0); std::vector v (MAX_ITERATION); std::generate(v.begin(), v.end(), random_fill()); // randomly fill the vector // test the C libraries gcvt function (the most low level function for // string conversion available) { std::string str; util::high_resolution_timer t; for (int i = 0; i < MAX_ITERATION; ++i) { gcvt(v[i], 10, buffer); str = buffer; // compensate for string ops in other benchmarks } cout << "gcvt: " << t.elapsed() << " [s]" << flush << endl; } // test the iostreams library { std::stringstream str; util::high_resolution_timer t; for (int i = 0; i < MAX_ITERATION; ++i) { str.str(""); str << v[i]; } cout << "iostreams: " << t.elapsed() << " [s]" << flush << endl; } // test the Boost.Format library { std::string str; boost::format double_format("%f"); util::high_resolution_timer t; for (int i = 0; i < MAX_ITERATION; ++i) { str = boost::str(double_format % v[i]); } cout << "Boost.Format: " << t.elapsed() << " [s]" << flush << endl; } // test the Karma double_ generation routines { std::string str; util::high_resolution_timer t; for (int i = 0; i < MAX_ITERATION; ++i) { char *ptr = buffer; karma::generate(ptr, double_, v[i]); *ptr = '\0'; str = buffer; // compensate for string ops in other benchmarks } cout << "double_: " << t.elapsed() << " [s]" << flush << endl; } return 0; }