1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Comparing the performance of a sequence of several generators</title> 5<link rel="stylesheet" href="../../../../../../../../doc/src/boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 7<link rel="home" href="../../../../index.html" title="Spirit 2.5.8"> 8<link rel="up" href="../numeric_performance.html" title="Performance of Numeric Generators"> 9<link rel="prev" href="double_performance.html" title="Comparing the performance of a single double_ generator"> 10<link rel="next" href="../../s05.html" title="Karma Index"> 11</head> 12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 13<table cellpadding="2" width="100%"><tr> 14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../../boost.png"></td> 15<td align="center"><a href="../../../../../../../../index.html">Home</a></td> 16<td align="center"><a href="../../../../../../../../libs/libraries.htm">Libraries</a></td> 17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 19<td align="center"><a href="../../../../../../../../more/index.htm">More</a></td> 20</tr></table> 21<hr> 22<div class="spirit-nav"> 23<a accesskey="p" href="double_performance.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../numeric_performance.html"><img src="../../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../../index.html"><img src="../../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../s05.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h5 class="title"> 27<a name="spirit.karma.performance_measurements.numeric_performance.format_performance"></a><a class="link" href="format_performance.html" title="Comparing the performance of a sequence of several generators">Comparing 28 the performance of a sequence of several generators</a> 29</h5></div></div></div> 30<p> 31 These performance measurements are centered around formatting of a sequence 32 of different items, including 2 <code class="computeroutput"><span class="keyword">double</span></code> 33 floating point numbers using different libraries and methods. The overall 34 execution times for those examples are compared below. We compare using 35 <code class="computeroutput"><span class="identifier">sprintf</span></code>, C++ iostreams, 36 <a href="../../../../../../../../libs/format/index.html" target="_top">Boost.Format</a>, and 37 <span class="emphasis"><em>Spirit.Karma</em></span>. 38 </p> 39<p> 40 For the full source code of the performance test please see here: <a href="../../../../../../workbench/karma/format_performance.cpp" target="_top">format_performance.cpp</a>. 41 All the measurements have been done by doing <code class="computeroutput"><span class="number">1e6</span></code> 42 iterations for each formatting type (NUMITERATIONS is set to <code class="computeroutput"><span class="number">1e6</span></code>). 43 </p> 44<p> 45 Code used to measure the performance for sprintf: 46 </p> 47<p> 48</p> 49<pre class="programlisting"><span class="keyword">char</span> <span class="identifier">buffer</span><span class="special">[</span><span class="number">256</span><span class="special">];</span> 50<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">NUMITERATIONS</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 51 <span class="identifier">sprintf</span><span class="special">(</span><span class="identifier">buffer</span><span class="special">,</span> <span class="string">"[%-14.3f%-14.3f]"</span><span class="special">,</span> <span class="number">12345.12345</span><span class="special">,</span> <span class="number">12345.12345</span><span class="special">);</span> 52<span class="special">}</span> 53</pre> 54<p> 55 </p> 56<p> 57 Code used to measure the performance for standard iostreams: 58 </p> 59<p> 60</p> 61<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">stringstream</span> <span class="identifier">strm</span><span class="special">;</span> 62<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">NUMITERATIONS</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 63 <span class="identifier">strm</span><span class="special">.</span><span class="identifier">str</span><span class="special">(</span><span class="string">""</span><span class="special">);</span> 64 <span class="identifier">strm</span> <span class="special"><<</span> <span class="char">'['</span> 65 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setiosflags</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ios</span><span class="special">::</span><span class="identifier">fixed</span><span class="special">)</span> 66 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">left</span> 67 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setprecision</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> 68 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setw</span><span class="special">(</span><span class="number">14</span><span class="special">)</span> 69 <span class="special"><<</span> <span class="number">12345.12345</span> 70 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">setw</span><span class="special">(</span><span class="number">14</span><span class="special">)</span> 71 <span class="special"><<</span> <span class="number">12345.12345</span> 72 <span class="special"><<</span> <span class="char">']'</span><span class="special">;</span> 73<span class="special">}</span> 74</pre> 75<p> 76 </p> 77<p> 78 Code used to measure the performance for <a href="../../../../../../../../libs/format/index.html" target="_top">Boost.Format</a>: 79 </p> 80<p> 81</p> 82<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">generated</span><span class="special">;</span> 83<span class="identifier">boost</span><span class="special">::</span><span class="identifier">format</span> <span class="identifier">outformat</span><span class="special">(</span><span class="string">"[%-14.3f%-14.3f]"</span><span class="special">);</span> 84<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">NUMITERATIONS</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> 85 <span class="identifier">generated</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">str</span><span class="special">(</span><span class="identifier">outformat</span> <span class="special">%</span> <span class="number">12345.12345</span> <span class="special">%</span> <span class="number">12345.12345</span><span class="special">);</span> 86</pre> 87<p> 88 </p> 89<p> 90 The following code shows the common definitions used by all <span class="emphasis"><em>Spirit.Karma</em></span> 91 performance measurements as listed below: 92 </p> 93<p> 94</p> 95<pre class="programlisting"><span class="keyword">template</span> <span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span> 96<span class="keyword">struct</span> <span class="identifier">double3_policy</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">karma</span><span class="special">::</span><span class="identifier">real_policies</span><span class="special"><</span><span class="identifier">T</span><span class="special">></span> 97<span class="special">{</span> 98 <span class="comment">// we want to generate up to 3 fractional digits</span> 99 <span class="keyword">static</span> <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">precision</span><span class="special">(</span><span class="identifier">T</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="number">3</span><span class="special">;</span> <span class="special">}</span> 100<span class="special">};</span> 101 102<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">spirit</span><span class="special">::</span><span class="identifier">karma</span><span class="special">::</span><span class="identifier">real_generator</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="identifier">double3_policy</span><span class="special"><</span><span class="keyword">double</span><span class="special">></span> <span class="special">></span> 103 <span class="identifier">double3_type</span><span class="special">;</span> 104<span class="identifier">double3_type</span> <span class="keyword">const</span> <span class="identifier">double3</span> <span class="special">=</span> <span class="identifier">double3_type</span><span class="special">();</span> 105</pre> 106<p> 107 </p> 108<p> 109 Code used to measure the performance for <span class="emphasis"><em>Spirit.Karma</em></span> 110 using a plain character buffer: 111 </p> 112<p> 113</p> 114<pre class="programlisting"><span class="keyword">char</span> <span class="identifier">buffer</span><span class="special">[</span><span class="number">256</span><span class="special">];</span> 115<span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">NUMITERATIONS</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span> 116 <span class="keyword">char</span> <span class="special">*</span><span class="identifier">p</span> <span class="special">=</span> <span class="identifier">buffer</span><span class="special">;</span> 117 <span class="identifier">generate</span><span class="special">(</span><span class="identifier">p</span> 118 <span class="special">,</span> <span class="char">'['</span> <span class="special"><<</span> <span class="identifier">left_align</span><span class="special">(</span><span class="number">14</span><span class="special">)[</span><span class="identifier">double3</span><span class="special">]</span> <span class="special"><<</span> <span class="identifier">left_align</span><span class="special">(</span><span class="number">14</span><span class="special">)[</span><span class="identifier">double3</span><span class="special">]</span> <span class="special"><<</span> <span class="char">']'</span> 119 <span class="special">,</span> <span class="number">12345.12345</span><span class="special">,</span> <span class="number">12345.12345</span><span class="special">);</span> 120 <span class="special">*</span><span class="identifier">p</span> <span class="special">=</span> <span class="char">'\0'</span><span class="special">;</span> 121<span class="special">}</span> 122</pre> 123<p> 124 </p> 125<p> 126 The following table shows the overall performance results collected while 127 using different compilers. All times are in seconds measured for <code class="computeroutput"><span class="number">1e6</span></code> iterations (platform: Windows7, Intel 128 Core Duo(tm) Processor, 2.8GHz, 4GByte RAM). For a more readable comparison 129 of the results see this <a class="link" href="format_performance.html#spirit.karma.format_performance" title="Figure 5. Performance comparison for a sequence of several items">figure</a>. 130 </p> 131<div class="table"> 132<a name="spirit.karma.performance_measurements.numeric_performance.format_performance.performance_comparison_for_a_sequence_of_several_items__all_times_in__s____1e6__iterations_"></a><p class="title"><b>Table 7. Performance comparison for a sequence of several items (all times 133 in [s], `1e6` iterations)</b></p> 134<div class="table-contents"><table class="table" summary="Performance comparison for a sequence of several items (all times 135 in [s], `1e6` iterations)"> 136<colgroup> 137<col> 138<col> 139<col> 140<col> 141<col> 142<col> 143<col> 144</colgroup> 145<thead><tr> 146<th> 147 <p> 148 Library 149 </p> 150 </th> 151<th> 152 <p> 153 gcc 4.4.0 (32 bit) 154 </p> 155 </th> 156<th> 157 <p> 158 VC++ 10 (32 bit) 159 </p> 160 </th> 161<th> 162 <p> 163 Intel 11.1 (32 bit) 164 </p> 165 </th> 166<th> 167 <p> 168 gcc 4.4.0 (64 bit) 169 </p> 170 </th> 171<th> 172 <p> 173 VC++ 10 (64 bit) 174 </p> 175 </th> 176<th> 177 <p> 178 Intel 11.1 (64 bit) 179 </p> 180 </th> 181</tr></thead> 182<tbody> 183<tr> 184<td> 185 <p> 186 sprintf 187 </p> 188 </td> 189<td> 190 <p> 191 1.725 192 </p> 193 </td> 194<td> 195 <p> 196 1.892 197 </p> 198 </td> 199<td> 200 <p> 201 1.903 202 </p> 203 </td> 204<td> 205 <p> 206 1.469 207 </p> 208 </td> 209<td> 210 <p> 211 1.608 212 </p> 213 </td> 214<td> 215 <p> 216 1.493 217 </p> 218 </td> 219</tr> 220<tr> 221<td> 222 <p> 223 iostreams 224 </p> 225 </td> 226<td> 227 <p> 228 4.827 229 </p> 230 </td> 231<td> 232 <p> 233 5.287 234 </p> 235 </td> 236<td> 237 <p> 238 4.444 239 </p> 240 </td> 241<td> 242 <p> 243 3.112 244 </p> 245 </td> 246<td> 247 <p> 248 3.319 249 </p> 250 </td> 251<td> 252 <p> 253 2.877 254 </p> 255 </td> 256</tr> 257<tr> 258<td> 259 <p> 260 <a href="../../../../../../../../libs/format/index.html" target="_top">Boost.Format</a> 261 </p> 262 </td> 263<td> 264 <p> 265 5.881 266 </p> 267 </td> 268<td> 269 <p> 270 7.089 271 </p> 272 </td> 273<td> 274 <p> 275 5.801 276 </p> 277 </td> 278<td> 279 <p> 280 5.455 281 </p> 282 </td> 283<td> 284 <p> 285 5.254 286 </p> 287 </td> 288<td> 289 <p> 290 4.164 291 </p> 292 </td> 293</tr> 294<tr> 295<td> 296 <p> 297 <span class="emphasis"><em>Spirit.Karma</em></span> 298 </p> 299 </td> 300<td> 301 <p> 302 1.942 303 </p> 304 </td> 305<td> 306 <p> 307 1.242 308 </p> 309 </td> 310<td> 311 <p> 312 0.999 313 </p> 314 </td> 315<td> 316 <p> 317 1.334 318 </p> 319 </td> 320<td> 321 <p> 322 0.758 323 </p> 324 </td> 325<td> 326 <p> 327 0.686 328 </p> 329 </td> 330</tr> 331</tbody> 332</table></div> 333</div> 334<br class="table-break"><p> 335 </p> 336<div class="figure"> 337<a name="spirit.karma.format_performance"></a><p class="title"><b>Figure 5. Performance comparison for a sequence 338 of several items</b></p> 339<div class="figure-contents"><span class="inlinemediaobject"><img src="../../../.././images/format_performance.png" alt="Performance comparison for a sequence of several items"></span></div> 340</div> 341<p><br class="figure-break"> 342 </p> 343</div> 344<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 345<td align="left"></td> 346<td align="right"><div class="copyright-footer">Copyright © 2001-2011 Joel de Guzman, Hartmut Kaiser<p> 347 Distributed under the Boost Software License, Version 1.0. (See accompanying 348 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 349 </p> 350</div></td> 351</tr></table> 352<hr> 353<div class="spirit-nav"> 354<a accesskey="p" href="double_performance.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../numeric_performance.html"><img src="../../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../../index.html"><img src="../../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../../s05.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a> 355</div> 356</body> 357</html> 358