123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- // 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 <climits>
- #include <cassert>
- #include <iostream>
- #include <sstream>
- #include <boost/format.hpp>
- #include <boost/spirit/include/karma.hpp>
- #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<double> 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;
- }
|