1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Performance</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="Chapter 1. Boost.Convert 2.0"> 8<link rel="up" href="../index.html" title="Chapter 1. Boost.Convert 2.0"> 9<link rel="prev" href="algorithms.html" title="Boost.Convert with Standard Algorithms"> 10<link rel="next" href="performance/boost_convert_overhead.html" title="Boost.Convert Overhead"> 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="algorithms.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="performance/boost_convert_overhead.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 27<a name="boost_convert.performance"></a><a class="link" href="performance.html" title="Performance">Performance</a> 28</h2></div></div></div> 29<div class="toc"><dl class="toc"> 30<dt><span class="section"><a href="performance.html#boost_convert.performance.converters_compared">Converters 31 Compared</a></span></dt> 32<dt><span class="section"><a href="performance/boost_convert_overhead.html">Boost.Convert 33 Overhead</a></span></dt> 34<dt><span class="section"><a href="performance/the_bigger_picture.html">The Bigger 35 Picture</a></span></dt> 36</dl></div> 37<div class="section"> 38<div class="titlepage"><div><div><h3 class="title"> 39<a name="boost_convert.performance.converters_compared"></a><a class="link" href="performance.html#boost_convert.performance.converters_compared" title="Converters Compared">Converters 40 Compared</a> 41</h3></div></div></div> 42<p> 43 The performance of <span class="emphasis"><em>Boost.Convert</em></span> depends entirely on 44 the performance of the converter deployed. A few converters have been tested 45 for string conversions to basic types and to a user-defined type. 46 </p> 47<p> 48 In turn, the performance of every particular converter depends on the platform, 49 the compiler used and the particular implementation of the underlying conversion 50 component (<code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">stream</span></code>, <code class="computeroutput"><span class="identifier">printf</span></code>, 51 <span class="emphasis"><em>Boost.Spirit</em></span>, etc.). Consequently, the results below 52 are only an approximate indication of <span class="emphasis"><em>relative</em></span> performance 53 of the mentioned converters on the tested platforms. 54 </p> 55<p> 56 When compiled with gcc-5.4.0 on 64-bit Ubuntu 16.04, tests produced the following 57 results: 58 </p> 59<pre class="programlisting"><span class="identifier">str</span><span class="special">-</span><span class="identifier">to</span><span class="special">-</span><span class="keyword">int</span><span class="special">:</span> <span class="identifier">spirit</span><span class="special">/</span><span class="identifier">strtol</span><span class="special">/</span><span class="identifier">lcast</span><span class="special">/</span><span class="identifier">scanf</span><span class="special">/</span><span class="identifier">stream</span><span class="special">=</span> <span class="number">0.27</span><span class="special">/</span> <span class="number">0.35</span><span class="special">/</span> <span class="number">0.92</span><span class="special">/</span> <span class="number">2.11</span><span class="special">/</span> <span class="number">2.09</span> <span class="identifier">seconds</span><span class="special">.</span> 60<span class="identifier">str</span><span class="special">-</span><span class="identifier">to</span><span class="special">-</span><span class="identifier">lng</span><span class="special">:</span> <span class="identifier">spirit</span><span class="special">/</span><span class="identifier">strtol</span><span class="special">/</span><span class="identifier">lcast</span><span class="special">/</span><span class="identifier">scanf</span><span class="special">/</span><span class="identifier">stream</span><span class="special">=</span> <span class="number">0.69</span><span class="special">/</span> <span class="number">0.31</span><span class="special">/</span> <span class="number">1.28</span><span class="special">/</span> <span class="number">2.07</span><span class="special">/</span> <span class="number">2.50</span> <span class="identifier">seconds</span><span class="special">.</span> 61<span class="identifier">str</span><span class="special">-</span><span class="identifier">to</span><span class="special">-</span><span class="identifier">dbl</span><span class="special">:</span> <span class="identifier">spirit</span><span class="special">/</span><span class="identifier">strtol</span><span class="special">/</span><span class="identifier">lcast</span><span class="special">/</span><span class="identifier">scanf</span><span class="special">/</span><span class="identifier">stream</span><span class="special">=</span> <span class="number">0.73</span><span class="special">/</span> <span class="number">1.06</span><span class="special">/</span> <span class="number">7.95</span><span class="special">/</span> <span class="number">2.87</span><span class="special">/</span> <span class="number">5.10</span> <span class="identifier">seconds</span><span class="special">.</span> 62<span class="keyword">int</span><span class="special">-</span><span class="identifier">to</span><span class="special">-</span><span class="identifier">str</span><span class="special">:</span> <span class="identifier">spirit</span><span class="special">/</span><span class="identifier">strtol</span><span class="special">/</span><span class="identifier">lcast</span><span class="special">/</span><span class="identifier">prntf</span><span class="special">/</span><span class="identifier">stream</span><span class="special">=</span> <span class="number">1.96</span><span class="special">/</span> <span class="number">1.39</span><span class="special">/</span> <span class="number">2.52</span><span class="special">/</span> <span class="number">3.49</span><span class="special">/</span> <span class="number">2.58</span> <span class="identifier">seconds</span><span class="special">.</span> 63<span class="identifier">lng</span><span class="special">-</span><span class="identifier">to</span><span class="special">-</span><span class="identifier">str</span><span class="special">:</span> <span class="identifier">spirit</span><span class="special">/</span><span class="identifier">strtol</span><span class="special">/</span><span class="identifier">lcast</span><span class="special">/</span><span class="identifier">prntf</span><span class="special">/</span><span class="identifier">stream</span><span class="special">=</span> <span class="number">2.45</span><span class="special">/</span> <span class="number">1.51</span><span class="special">/</span> <span class="number">2.32</span><span class="special">/</span> <span class="number">3.30</span><span class="special">/</span> <span class="number">2.63</span> <span class="identifier">seconds</span><span class="special">.</span> 64<span class="identifier">dbl</span><span class="special">-</span><span class="identifier">to</span><span class="special">-</span><span class="identifier">str</span><span class="special">:</span> <span class="identifier">spirit</span><span class="special">/</span><span class="identifier">strtol</span><span class="special">/</span><span class="identifier">lcast</span><span class="special">/</span><span class="identifier">prntf</span><span class="special">/</span><span class="identifier">stream</span><span class="special">=</span> <span class="number">6.62</span><span class="special">/</span> <span class="number">4.46</span><span class="special">/</span> <span class="number">28.69</span><span class="special">/</span> <span class="number">20.60</span><span class="special">/</span> <span class="number">14.16</span> <span class="identifier">seconds</span><span class="special">.</span> 65</pre> 66<p> 67 Based on the results, all things considered, I tend to conclude that there 68 is no clear winner: 69 </p> 70<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 71<li class="listitem"> 72 the <span class="emphasis"><em>Spirit.Qi</em></span>-based converter was the fastest for 73 string to basic (<code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="keyword">double</span></code>) conversions. So, it might be a 74 good candidate for the tasks predominantly doing that kind of conversions 75 (with <span class="emphasis"><em>Spirit.Qi</em></span> conversion-related limitations in 76 mind); <span class="emphasis"><em>Spirit.Karma</em></span>'s <span class="emphasis"><em>to-string</em></span> 77 performance did not seem as impressive; 78 </li> 79<li class="listitem"> 80 the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">iostream</span></code>-based converter was comparatively 81 slow. Still, given its maturity, availability and formatting support, 82 it might be an option to consider if conversion performance is not your 83 primary concern; 84 </li> 85<li class="listitem"> 86 the <code class="computeroutput"><span class="identifier">strtol</span></code>-inspired converter 87 was reasonably fast and with formatting support might be an attractive 88 all-rounder. It should be noted that it is nowhere as mature as <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">lexical_cast</span></code> or <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">stream</span></code>. 89 So, bugs are to be expected. 90 </li> 91</ul></div> 92<p> 93 For user-defined types <code class="computeroutput"><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">lexical_cast</span></code>, 94 <code class="computeroutput"><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">cstream</span></code> and <code class="computeroutput"><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">strtol</span></code> 95 were tested with the following results: 96 </p> 97<pre class="programlisting"><span class="identifier">str</span><span class="special">-</span><span class="identifier">to</span><span class="special">-</span><span class="identifier">user</span><span class="special">-</span><span class="identifier">type</span><span class="special">:</span> <span class="identifier">lcast</span><span class="special">/</span><span class="identifier">stream</span><span class="special">/</span><span class="identifier">strtol</span><span class="special">=</span><span class="number">0.36</span><span class="special">/</span><span class="number">0.18</span><span class="special">/</span><span class="number">0.07</span> <span class="identifier">seconds</span><span class="special">.</span> 98<span class="identifier">user</span><span class="special">-</span><span class="identifier">type</span><span class="special">-</span><span class="identifier">to</span><span class="special">-</span><span class="identifier">str</span><span class="special">:</span> <span class="identifier">lcast</span><span class="special">/</span><span class="identifier">stream</span><span class="special">/</span><span class="identifier">strtol</span><span class="special">=</span><span class="number">0.58</span><span class="special">/</span><span class="number">0.09</span><span class="special">/</span><span class="number">0.06</span> <span class="identifier">seconds</span><span class="special">.</span> 99</pre> 100<p> 101 To provide <span class="emphasis"><em>string-to-user-type</em></span> and <span class="emphasis"><em>user-type-to-string</em></span> 102 conversions the first two deploy the same standard <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">iostream</span></code> 103 library. However, <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">cstream</span></code> 104 considerably outperforms <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span></code> 105 in these tests. The results reflect different underlying designs. Namely, 106 the standard <span class="emphasis"><em>Boost.Convert</em></span> deployment pattern is to 107 create a converter or converters once and then re-use them. <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span></code>, on the other hand, creates 108 and then destroys a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">stream</span></code> instance every time the function 109 is called and the <a href="http://www.boost.org/doc/libs/1_55_0/doc/html/boost_lexical_cast/performance.html" target="_top"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">lexical_cast</span></code> performance</a> table 110 indicates that the "std::stringstream <span class="emphasis"><em>with construction</em></span>" 111 operation is considerably more expensive compared to "std::stringstream 112 <span class="emphasis"><em>without construction</em></span>". 113 </p> 114<p> 115 <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">cnv</span><span class="special">::</span><span class="identifier">strtol</span></code> 116 support for user types has been implemented similarly but without the <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">stream</span></code>-related 117 overhead. That resulted in the best out-of-three performance results. 118 </p> 119<p> 120 Based on the performance data, I tend to conclude that, given type-safety 121 and benefits provided by the <span class="emphasis"><em>Boost.Convert</em></span> framework, 122 it (with appropriate converters) should probably be the first choice for 123 conversion-related tasks. 124 </p> 125</div> 126</div> 127<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 128<td align="left"></td> 129<td align="right"><div class="copyright-footer">Copyright © 2009-2016 Vladimir Batov<p> 130 Distributed under the Boost Software License, Version 1.0. See copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>. 131 </p> 132</div></td> 133</tr></table> 134<hr> 135<div class="spirit-nav"> 136<a accesskey="p" href="algorithms.html"><img src="../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../index.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="performance/boost_convert_overhead.html"><img src="../../../../../doc/src/images/next.png" alt="Next"></a> 137</div> 138</body> 139</html> 140