• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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