1 // Copyright (c) 2002-2010 Hartmut Kaiser
2 // Copyright (c) 2002-2010 Joel de Guzman
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 #include <boost/config/warning_disable.hpp>
8 #include <boost/spirit/include/karma.hpp>
9 #include <boost/format.hpp>
13 #include "../high_resolution_timer.hpp"
15 #define NUMITERATIONS 1000000
17 ///////////////////////////////////////////////////////////////////////////////
18 // We generate plain floating point numbers in this test
19 //[karma_double_performance_definitions
20 using boost::spirit::karma::double_;
23 void format_performance_karma()
25 using boost::spirit::karma::generate;
27 //[karma_double_performance_plain
30 util::high_resolution_timer t;
32 for (int i = 0; i < NUMITERATIONS; ++i) {
34 generate(p, double_, 12345.12345);
39 std::cout << "karma:\t\t" << t.elapsed() << std::endl;
40 // std::cout << buffer << std::endl;
43 void format_performance_rule()
45 using boost::spirit::karma::generate;
47 boost::spirit::karma::rule<char*, double()> r;
49 //[karma_double_performance_rule
53 util::high_resolution_timer t;
55 for (int i = 0; i < NUMITERATIONS; ++i) {
57 generate(p, r, 12345.12345);
62 std::cout << "karma (rule):\t" << t.elapsed() << std::endl;
63 // std::cout << buffer << std::endl;
66 void format_performance_direct()
68 using boost::spirit::karma::generate;
69 using boost::spirit::karma::real_inserter;
71 //[karma_double_performance_direct
72 typedef real_inserter<double> inserter;
75 util::high_resolution_timer t;
77 for (int i = 0; i < NUMITERATIONS; ++i) {
79 inserter::call(p, 12345.12345);
84 std::cout << "karma (direct):\t" << t.elapsed() << std::endl;
85 // std::cout << buffer << std::endl;
88 void format_performance_string()
90 using boost::spirit::karma::generate;
92 //[karma_double_performance_string
93 std::string generated;
94 std::back_insert_iterator<std::string> sink(generated);
96 util::high_resolution_timer t;
98 for (int i = 0; i < NUMITERATIONS; ++i) {
100 generate(sink, double_, 12345.12345);
104 std::cout << "karma (string):\t" << t.elapsed() << std::endl;
105 // std::cout << generated << std::endl;
109 void format_performance_boost_format()
111 //[karma_double_performance_format
112 std::string generated;
113 boost::format double_format("%f");
115 util::high_resolution_timer t;
117 for (int i = 0; i < NUMITERATIONS; ++i)
118 generated = boost::str(double_format % 12345.12345);
121 std::cout << "format:\t\t" << t.elapsed() << std::endl;
122 // std::cout << strm.str() << std::endl;
125 void format_performance_sprintf()
127 util::high_resolution_timer t;
129 //[karma_double_performance_printf
131 for (int i = 0; i < NUMITERATIONS; ++i) {
132 sprintf(buffer, "%f", 12345.12345);
136 std::cout << "sprintf:\t" << t.elapsed() << std::endl;
137 // std::cout << buffer << std::endl;
140 void format_performance_iostreams()
142 //[karma_double_performance_iostreams
143 std::stringstream strm;
145 util::high_resolution_timer t;
147 for (int i = 0; i < NUMITERATIONS; ++i) {
153 std::cout << "iostreams:\t" << t.elapsed() << std::endl;
154 // std::cout << strm.str() << std::endl;
157 ///////////////////////////////////////////////////////////////////////////////
160 format_performance_sprintf();
161 format_performance_iostreams();
162 format_performance_boost_format();
163 format_performance_karma();
164 format_performance_string();
165 format_performance_rule();
166 format_performance_direct();