1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
4 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
5 <title>Performance</title>
6 <link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css">
7 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
8 <link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset">
9 <link rel="up" href="../poly_collection.html" title="Chapter 28. Boost.PolyCollection">
10 <link rel="prev" href="tutorial.html" title="Tutorial">
11 <link rel="next" href="reference.html" title="Reference">
13 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
14 <table cellpadding="2" width="100%"><tr>
15 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td>
16 <td align="center"><a href="../../../index.html">Home</a></td>
17 <td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td>
18 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
19 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
20 <td align="center"><a href="../../../more/index.htm">More</a></td>
23 <div class="spirit-nav">
24 <a accesskey="p" href="tutorial.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../poly_collection.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="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
27 <div class="titlepage"><div><div><h2 class="title" style="clear: both">
28 <a name="poly_collection.performance"></a><a class="link" href="performance.html" title="Performance">Performance</a>
29 </h2></div></div></div>
30 <div class="toc"><dl class="toc">
31 <dt><span class="section"><a href="performance.html#poly_collection.performance.container_definitions">Container
32 definitions</a></span></dt>
33 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests">Insertion
35 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests">Processing
39 (Testing program at <a href="../../../libs/poly_collection/example/perf.cpp" target="_top"><code class="computeroutput"><span class="identifier">perf</span><span class="special">.</span><span class="identifier">cpp</span></code></a>.)
42 We ran tests to measure the performance of the containers of Boost.PolyCollection
45 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
47 Insertion of elements.
50 Linear traversal and processing with <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span></code>
51 and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">poly_collection</span><span class="special">::</span><span class="identifier">for_each</span></code> (with and without <a class="link" href="tutorial.html#poly_collection.tutorial.algorithms.type_restitution" title="Type restitution">type
56 As a comparison baseline we used containers and facilities from the standard
57 library and Boost (details below). Tests were run in the following environments:
59 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
61 <span class="bold"><strong>Visual Studio 2015 x86</strong></span>: Visual C++ 2015
62 in 32-bit (x86) release mode, Windows 7 64-bit, Intel Core i5-2520M @2.5GHz
65 <span class="bold"><strong>Visual Studio 2015 x64</strong></span>: Visual C++ 2015
66 in 64-bit (x64) release mode, same machine
69 <span class="bold"><strong>GCC 6.3 x64</strong></span>: GCC 6.3 release mode, Xubuntu
70 17.04 x64, Intel Core i7-5820 @3.3GHz
73 <span class="bold"><strong>Clang 4.0 x64</strong></span>: Clang 4.0 release mode,
78 <div class="titlepage"><div><div><h3 class="title">
79 <a name="poly_collection.performance.container_definitions"></a><a class="link" href="performance.html#poly_collection.performance.container_definitions" title="Container definitions">Container
81 </h3></div></div></div>
82 <div class="toc"><dl class="toc">
83 <dt><span class="section"><a href="performance.html#poly_collection.performance.container_definitions.boost_base_collection"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">base_collection</span></code></a></span></dt>
84 <dt><span class="section"><a href="performance.html#poly_collection.performance.container_definitions.boost_function_collection"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_collection</span></code></a></span></dt>
85 <dt><span class="section"><a href="performance.html#poly_collection.performance.container_definitions.boost_any_collection"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">any_collection</span></code></a></span></dt>
88 <div class="titlepage"><div><div><h4 class="title">
89 <a name="poly_collection.performance.container_definitions.boost_base_collection"></a><a class="link" href="performance.html#poly_collection.performance.container_definitions.boost_base_collection" title="boost::base_collection"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">base_collection</span></code></a>
90 </h4></div></div></div>
91 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
93 Baseline container: <code class="computeroutput"><span class="identifier">ptr_vector</span></code>
94 = <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">ptr_vector</span><span class="special"><</span><span class="identifier">base</span><span class="special">></span></code>
97 Polymorphic collection: <code class="computeroutput"><span class="identifier">base_collection</span></code>
98 = <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">base_collection</span><span class="special"><</span><span class="identifier">base</span><span class="special">></span></code>
100 <li class="listitem">
101 Element types: <code class="computeroutput"><span class="identifier">T1</span></code> =
102 <code class="computeroutput"><span class="identifier">derived1</span></code>, <code class="computeroutput"><span class="identifier">T2</span></code> = <code class="computeroutput"><span class="identifier">derived2</span></code>,
103 <code class="computeroutput"><span class="identifier">T3</span></code> = <code class="computeroutput"><span class="identifier">derived3</span></code>
106 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">base</span>
107 <span class="special">{</span>
108 <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">base</span><span class="special">()=</span><span class="keyword">default</span><span class="special">;</span>
109 <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span><span class="special">)</span><span class="keyword">const</span><span class="special">=</span><span class="number">0</span><span class="special">;</span>
110 <span class="special">};</span>
112 <span class="keyword">struct</span> <span class="identifier">derived1</span> <span class="identifier">final</span><span class="special">:</span><span class="identifier">base</span>
113 <span class="special">{</span>
114 <span class="identifier">derived1</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">):</span><span class="identifier">n</span><span class="special">{</span><span class="identifier">n</span><span class="special">}{}</span>
115 <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span><span class="special">)</span><span class="keyword">const</span><span class="special">{</span><span class="keyword">return</span> <span class="identifier">n</span><span class="special">;}</span>
117 <span class="keyword">int</span> <span class="identifier">n</span><span class="special">;</span>
118 <span class="special">};</span>
120 <span class="keyword">struct</span> <span class="identifier">derived2</span> <span class="identifier">final</span><span class="special">:</span><span class="identifier">base</span>
121 <span class="special">{</span>
122 <span class="identifier">derived2</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">):</span><span class="identifier">n</span><span class="special">{</span><span class="identifier">n</span><span class="special">}{}</span>
123 <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span><span class="keyword">const</span><span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span><span class="special">*</span><span class="identifier">n</span><span class="special">;}</span>
125 <span class="keyword">int</span> <span class="identifier">unused</span><span class="special">,</span><span class="identifier">n</span><span class="special">;</span>
126 <span class="special">};</span>
128 <span class="keyword">struct</span> <span class="identifier">derived3</span> <span class="identifier">final</span><span class="special">:</span><span class="identifier">base</span>
129 <span class="special">{</span>
130 <span class="identifier">derived3</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">):</span><span class="identifier">n</span><span class="special">{</span><span class="identifier">n</span><span class="special">}{}</span>
131 <span class="keyword">virtual</span> <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span><span class="keyword">const</span><span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span><span class="special">*</span><span class="identifier">x</span><span class="special">*</span><span class="identifier">n</span><span class="special">;}</span>
133 <span class="keyword">int</span> <span class="identifier">unused</span><span class="special">,</span><span class="identifier">n</span><span class="special">;</span>
134 <span class="special">};</span>
137 <div class="section">
138 <div class="titlepage"><div><div><h4 class="title">
139 <a name="poly_collection.performance.container_definitions.boost_function_collection"></a><a class="link" href="performance.html#poly_collection.performance.container_definitions.boost_function_collection" title="boost::function_collection"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_collection</span></code></a>
140 </h4></div></div></div>
141 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
142 <li class="listitem">
143 Baseline container: <code class="computeroutput"><span class="identifier">func_vector</span></code>
144 = <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">int</span><span class="special">(</span><span class="keyword">int</span><span class="special">)>></span></code>
146 <li class="listitem">
147 Polymorphic collection: <code class="computeroutput"><span class="identifier">function_collection</span></code>
148 = <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_collection</span><span class="special"><</span><span class="keyword">int</span><span class="special">(</span><span class="keyword">int</span><span class="special">)></span></code>
150 <li class="listitem">
151 Element types: <code class="computeroutput"><span class="identifier">T1</span></code> =
152 <code class="computeroutput"><span class="identifier">concrete1</span></code>, <code class="computeroutput"><span class="identifier">T2</span></code> = <code class="computeroutput"><span class="identifier">concrete2</span></code>,
153 <code class="computeroutput"><span class="identifier">T3</span></code> = <code class="computeroutput"><span class="identifier">concrete3</span></code>
156 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">concrete1</span>
157 <span class="special">{</span>
158 <span class="identifier">concrete1</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">):</span><span class="identifier">n</span><span class="special">{</span><span class="identifier">n</span><span class="special">}{}</span>
159 <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span><span class="special">)</span><span class="keyword">const</span><span class="special">{</span><span class="keyword">return</span> <span class="identifier">n</span><span class="special">;}</span>
161 <span class="keyword">int</span> <span class="identifier">n</span><span class="special">;</span>
162 <span class="special">};</span>
164 <span class="keyword">struct</span> <span class="identifier">concrete2</span>
165 <span class="special">{</span>
166 <span class="identifier">concrete2</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">):</span><span class="identifier">n</span><span class="special">{</span><span class="identifier">n</span><span class="special">}{}</span>
167 <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span><span class="keyword">const</span><span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span><span class="special">*</span><span class="identifier">n</span><span class="special">;}</span>
169 <span class="keyword">int</span> <span class="identifier">unused</span><span class="special">,</span><span class="identifier">n</span><span class="special">;</span>
170 <span class="special">};</span>
172 <span class="keyword">struct</span> <span class="identifier">concrete3</span>
173 <span class="special">{</span>
174 <span class="identifier">concrete3</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">n</span><span class="special">):</span><span class="identifier">n</span><span class="special">{</span><span class="identifier">n</span><span class="special">}{}</span>
175 <span class="keyword">int</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">int</span> <span class="identifier">x</span><span class="special">)</span><span class="keyword">const</span><span class="special">{</span><span class="keyword">return</span> <span class="identifier">x</span><span class="special">*</span><span class="identifier">x</span><span class="special">*</span><span class="identifier">n</span><span class="special">;}</span>
177 <span class="keyword">int</span> <span class="identifier">unused</span><span class="special">,</span><span class="identifier">n</span><span class="special">;</span>
178 <span class="special">};</span>
181 <div class="section">
182 <div class="titlepage"><div><div><h4 class="title">
183 <a name="poly_collection.performance.container_definitions.boost_any_collection"></a><a class="link" href="performance.html#poly_collection.performance.container_definitions.boost_any_collection" title="boost::any_collection"><code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">any_collection</span></code></a>
184 </h4></div></div></div>
185 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
186 <li class="listitem">
187 Baseline container: <code class="computeroutput"><span class="identifier">any_vector</span></code>
188 = <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_erasure</span><span class="special">::</span><span class="identifier">any</span><span class="special"><</span><span class="identifier">concept_</span><span class="special">>></span></code>
190 <li class="listitem">
191 Polymorphic collection: <code class="computeroutput"><span class="identifier">any_collection</span></code>
192 = <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">any_collection</span><span class="special"><</span><span class="identifier">concept_</span><span class="special">></span></code>
194 <li class="listitem">
195 Element types: <code class="computeroutput"><span class="identifier">T1</span></code> =
196 <code class="computeroutput"><span class="keyword">int</span></code>, <code class="computeroutput"><span class="identifier">T2</span></code>
197 = <code class="computeroutput"><span class="keyword">double</span></code>, <code class="computeroutput"><span class="identifier">T3</span></code> = <code class="computeroutput"><span class="keyword">char</span></code>
200 <pre class="programlisting"><span class="keyword">using</span> <span class="identifier">concept_</span><span class="special">=</span><span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span>
201 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_erasure</span><span class="special">::</span><span class="identifier">copy_constructible</span><span class="special"><>,</span>
202 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_erasure</span><span class="special">::</span><span class="identifier">relaxed</span><span class="special">,</span>
203 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_erasure</span><span class="special">::</span><span class="identifier">typeid_</span><span class="special"><>,</span>
204 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">type_erasure</span><span class="special">::</span><span class="identifier">incrementable</span><span class="special"><></span>
205 <span class="special">>;</span>
209 <div class="section">
210 <div class="titlepage"><div><div><h3 class="title">
211 <a name="poly_collection.performance.insertion_tests"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests" title="Insertion tests">Insertion
213 </h3></div></div></div>
214 <div class="toc"><dl class="toc">
215 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio">Results
216 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">base_collection</span></code></a></span></dt>
217 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle">Results
218 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_collection</span></code></a></span></dt>
219 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection">Results
220 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">any_collection</span></code></a></span></dt>
223 Tests measure the time taken to insert <span class="emphasis"><em>n</em></span> elements (<span class="emphasis"><em>n</em></span>
224 between 10<sup>2</sup> and 10<sup>7</sup>) from a source of values with types following the cyclic
228 <code class="computeroutput"><span class="identifier">T1</span></code> <code class="computeroutput"><span class="identifier">T1</span></code>
229 <code class="computeroutput"><span class="identifier">T2</span></code> <code class="computeroutput"><span class="identifier">T2</span></code>
230 <code class="computeroutput"><span class="identifier">T3</span></code> <code class="computeroutput"><span class="identifier">T1</span></code>
231 <code class="computeroutput"><span class="identifier">T1</span></code> <code class="computeroutput"><span class="identifier">T2</span></code>
232 <code class="computeroutput"><span class="identifier">T2</span></code> <code class="computeroutput"><span class="identifier">T3</span></code>
236 No <code class="computeroutput"><span class="identifier">reserve</span></code> operation is done
237 before insertion. The figures show resulting times in nanoseconds/element.
238 The horizontal axis is logarithmic.
240 <div class="section">
241 <div class="titlepage"><div><div><h4 class="title">
242 <a name="poly_collection.performance.insertion_tests.results_for_boost_base_collectio"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio" title="Results for boost::base_collection">Results
243 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">base_collection</span></code></a>
244 </h4></div></div></div>
245 <div class="toc"><dl class="toc">
246 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment">Visual
247 Studio 2015 x86</a></span></dt>
248 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment0">Visual
249 Studio 2015 x64</a></span></dt>
250 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment1">GCC
251 6.3 x64</a></span></dt>
252 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment2">Clang
253 4.0 x64</a></span></dt>
255 <div class="section">
256 <div class="titlepage"><div><div><h5 class="title">
257 <a name="poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment" title="Visual Studio 2015 x86">Visual
259 </h5></div></div></div>
261 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_base_vs2015_x86.png"></span>
263 <span class="aligncenter"><span class="bold"><strong>Insertion, Visual Studio
264 2015 x86</strong></span></span>
267 <div class="section">
268 <div class="titlepage"><div><div><h5 class="title">
269 <a name="poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment0"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment0" title="Visual Studio 2015 x64">Visual
271 </h5></div></div></div>
273 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_base_vs2015_x64.png"></span>
275 <span class="aligncenter"><span class="bold"><strong>Insertion, Visual Studio
276 2015 x64</strong></span></span>
279 <div class="section">
280 <div class="titlepage"><div><div><h5 class="title">
281 <a name="poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment1"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment1" title="GCC 6.3 x64">GCC
283 </h5></div></div></div>
285 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_base_gcc63_x64.png"></span>
287 <span class="aligncenter"><span class="bold"><strong>Insertion, GCC 6.3 x64</strong></span></span>
290 <div class="section">
291 <div class="titlepage"><div><div><h5 class="title">
292 <a name="poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment2"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_base_collectio.environment2" title="Clang 4.0 x64">Clang
294 </h5></div></div></div>
296 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_base_clang40_x64.png"></span>
298 <span class="aligncenter"><span class="bold"><strong>Insertion, Clang 4.0
299 x64</strong></span></span>
303 <div class="section">
304 <div class="titlepage"><div><div><h4 class="title">
305 <a name="poly_collection.performance.insertion_tests.results_for_boost_function_colle"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle" title="Results for boost::function_collection">Results
306 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_collection</span></code></a>
307 </h4></div></div></div>
308 <div class="toc"><dl class="toc">
309 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment">Visual
310 Studio 2015 x86</a></span></dt>
311 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment0">Visual
312 Studio 2015 x64</a></span></dt>
313 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment1">GCC
314 6.3 x64</a></span></dt>
315 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment2">Clang
316 4.0 x64</a></span></dt>
318 <div class="section">
319 <div class="titlepage"><div><div><h5 class="title">
320 <a name="poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment" title="Visual Studio 2015 x86">Visual
322 </h5></div></div></div>
324 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_function_vs2015_x86.png"></span>
326 <span class="aligncenter"><span class="bold"><strong>Insertion, Visual Studio
327 2015 x86</strong></span></span>
330 <div class="section">
331 <div class="titlepage"><div><div><h5 class="title">
332 <a name="poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment0"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment0" title="Visual Studio 2015 x64">Visual
334 </h5></div></div></div>
336 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_function_vs2015_x64.png"></span>
338 <span class="aligncenter"><span class="bold"><strong>Insertion, Visual Studio
339 2015 x64</strong></span></span>
342 <div class="section">
343 <div class="titlepage"><div><div><h5 class="title">
344 <a name="poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment1"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment1" title="GCC 6.3 x64">GCC
346 </h5></div></div></div>
348 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_function_gcc63_x64.png"></span>
350 <span class="aligncenter"><span class="bold"><strong>Insertion, GCC 6.3 x64</strong></span></span>
353 <div class="section">
354 <div class="titlepage"><div><div><h5 class="title">
355 <a name="poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment2"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_function_colle.environment2" title="Clang 4.0 x64">Clang
357 </h5></div></div></div>
359 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_function_clang40_x64.png"></span>
361 <span class="aligncenter"><span class="bold"><strong>Insertion, Clang 4.0
362 x64</strong></span></span>
366 <div class="section">
367 <div class="titlepage"><div><div><h4 class="title">
368 <a name="poly_collection.performance.insertion_tests.results_for_boost_any_collection"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection" title="Results for boost::any_collection">Results
369 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">any_collection</span></code></a>
370 </h4></div></div></div>
371 <div class="toc"><dl class="toc">
372 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment">Visual
373 Studio 2015 x86</a></span></dt>
374 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment0">Visual
375 Studio 2015 x64</a></span></dt>
376 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment1">GCC
377 6.3 x64</a></span></dt>
378 <dt><span class="section"><a href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment2">Clang
379 4.0 x64</a></span></dt>
381 <div class="section">
382 <div class="titlepage"><div><div><h5 class="title">
383 <a name="poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment" title="Visual Studio 2015 x86">Visual
385 </h5></div></div></div>
387 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_any_vs2015_x86.png"></span>
389 <span class="aligncenter"><span class="bold"><strong>Insertion, Visual Studio
390 2015 x86</strong></span></span>
393 <div class="section">
394 <div class="titlepage"><div><div><h5 class="title">
395 <a name="poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment0"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment0" title="Visual Studio 2015 x64">Visual
397 </h5></div></div></div>
399 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_any_vs2015_x64.png"></span>
401 <span class="aligncenter"><span class="bold"><strong>Insertion, Visual Studio
402 2015 x64</strong></span></span>
405 <div class="section">
406 <div class="titlepage"><div><div><h5 class="title">
407 <a name="poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment1"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment1" title="GCC 6.3 x64">GCC
409 </h5></div></div></div>
411 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_any_gcc63_x64.png"></span>
413 <span class="aligncenter"><span class="bold"><strong>Insertion, GCC 6.3 x64</strong></span></span>
416 <div class="section">
417 <div class="titlepage"><div><div><h5 class="title">
418 <a name="poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment2"></a><a class="link" href="performance.html#poly_collection.performance.insertion_tests.results_for_boost_any_collection.environment2" title="Clang 4.0 x64">Clang
420 </h5></div></div></div>
422 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/insert_any_clang40_x64.png"></span>
424 <span class="aligncenter"><span class="bold"><strong>Insertion, Clang 4.0
425 x64</strong></span></span>
430 <div class="section">
431 <div class="titlepage"><div><div><h3 class="title">
432 <a name="poly_collection.performance.processing_tests"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests" title="Processing tests">Processing
434 </h3></div></div></div>
435 <div class="toc"><dl class="toc">
436 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio">Results
437 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">base_collection</span></code></a></span></dt>
438 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle">Results
439 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_collection</span></code></a></span></dt>
440 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection">Results
441 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">any_collection</span></code></a></span></dt>
444 Tests measure the time taken to traverse a container of size <span class="emphasis"><em>n</em></span>
445 (<span class="emphasis"><em>n</em></span> between 10<sup>2</sup> and 10<sup>7</sup>) and execute an operation on each
446 of its elements. The operation for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">base_collection</span></code>
447 and <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_collection</span></code> (and the associated
448 baseline containers) is defined as
450 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">for_each_callable</span>
451 <span class="special">{</span>
452 <span class="identifier">for_each_callable</span><span class="special">():</span><span class="identifier">res</span><span class="special">{</span><span class="number">0</span><span class="special">}{}</span>
454 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
455 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T</span><span class="special">&</span> <span class="identifier">x</span><span class="special">){</span>
456 <span class="identifier">res</span><span class="special">+=</span><span class="identifier">x</span><span class="special">(</span><span class="number">2</span><span class="special">);</span>
457 <span class="special">}</span>
459 <span class="keyword">int</span> <span class="identifier">res</span><span class="special">;</span>
460 <span class="special">};</span>
463 whereas for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">any_collection</span></code> we use
465 <pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">for_each_incrementable</span>
466 <span class="special">{</span>
467 <span class="identifier">for_each_incrementable</span><span class="special">():</span><span class="identifier">res</span><span class="special">{</span><span class="number">0</span><span class="special">}{}</span>
469 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">T</span><span class="special">></span>
470 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="identifier">T</span><span class="special">&</span> <span class="identifier">x</span><span class="special">){</span>
471 <span class="special">++</span><span class="identifier">x</span><span class="special">;</span>
472 <span class="special">++</span><span class="identifier">res</span><span class="special">;</span>
473 <span class="special">}</span>
475 <span class="keyword">int</span> <span class="identifier">res</span><span class="special">;</span>
476 <span class="special">};</span>
479 The baseline container is tested with three different setups:
481 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
482 <li class="listitem">
483 Directly as initialized by the process described for the <a class="link" href="performance.html#poly_collection.performance.insertion_tests" title="Insertion tests">insertion
484 tests</a>. The sequence of types is complex enough that CPU's branch
485 prediction mechanisms are not able to fully anticipate it <a href="#ftn.poly_collection.performance.processing_tests.f0" class="footnote" name="poly_collection.performance.processing_tests.f0"><sup class="footnote">[21]</sup></a>. As elements are ordered according to their construction
486 time, certain degree of memory contiguity is expected.
488 <li class="listitem">
489 With an extra post-insertion stage by which elements are sorted according
490 to their <code class="computeroutput"><span class="keyword">typeid</span><span class="special">()</span></code>.
491 This increases branch prediction efficiency at the expense of having
492 worse cache friendliness.
494 <li class="listitem">
495 With an extra post-insertion stage that randomly shuffles all the elements
496 in the container. This is the worst possible scenario both in terms of
497 caching and branch prediction.
501 As for the polymorphic collection, three variations are measured:
503 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
504 <li class="listitem">
505 With <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span></code> (the same as the baseline
508 <li class="listitem">
509 Using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">poly_collection</span><span class="special">::</span><span class="identifier">for_each</span></code>.
511 <li class="listitem">
512 Using <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">poly_collection</span><span class="special">::</span><span class="identifier">for_each</span></code> with <a class="link" href="tutorial.html#poly_collection.tutorial.algorithms.type_restitution" title="Type restitution"><span class="emphasis"><em>type
513 restitution</em></span></a> of <code class="computeroutput"><span class="identifier">T1</span></code>,
514 <code class="computeroutput"><span class="identifier">T2</span></code> and <code class="computeroutput"><span class="identifier">T3</span></code>.
518 The figures show resulting times in nanoseconds/element. The horizontal axis
521 <div class="section">
522 <div class="titlepage"><div><div><h4 class="title">
523 <a name="poly_collection.performance.processing_tests.results_for_boost_base_collectio"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio" title="Results for boost::base_collection">Results
524 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">base_collection</span></code></a>
525 </h4></div></div></div>
526 <div class="toc"><dl class="toc">
527 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment">Visual
528 Studio 2015 x86</a></span></dt>
529 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment0">Visual
530 Studio 2015 x64</a></span></dt>
531 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment1">GCC
532 6.3 x64</a></span></dt>
533 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment2">Clang
534 4.0 x64</a></span></dt>
536 <div class="section">
537 <div class="titlepage"><div><div><h5 class="title">
538 <a name="poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment" title="Visual Studio 2015 x86">Visual
540 </h5></div></div></div>
542 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_base_vs2015_x86.png"></span>
544 <span class="aligncenter"><span class="bold"><strong>Processing, Visual Studio
545 2015 x86</strong></span></span>
548 <div class="section">
549 <div class="titlepage"><div><div><h5 class="title">
550 <a name="poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment0"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment0" title="Visual Studio 2015 x64">Visual
552 </h5></div></div></div>
554 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_base_vs2015_x64.png"></span>
556 <span class="aligncenter"><span class="bold"><strong>Processing, Visual Studio
557 2015 x64</strong></span></span>
560 <div class="section">
561 <div class="titlepage"><div><div><h5 class="title">
562 <a name="poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment1"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment1" title="GCC 6.3 x64">GCC
564 </h5></div></div></div>
566 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_base_gcc63_x64.png"></span>
568 <span class="aligncenter"><span class="bold"><strong>Processing, GCC 6.3
569 x64</strong></span></span>
572 <div class="section">
573 <div class="titlepage"><div><div><h5 class="title">
574 <a name="poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment2"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_base_collectio.environment2" title="Clang 4.0 x64">Clang
576 </h5></div></div></div>
578 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_base_clang40_x64.png"></span>
580 <span class="aligncenter"><span class="bold"><strong>Processing, Clang 4.0
581 x64</strong></span></span>
585 <div class="section">
586 <div class="titlepage"><div><div><h4 class="title">
587 <a name="poly_collection.performance.processing_tests.results_for_boost_function_colle"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle" title="Results for boost::function_collection">Results
588 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">function_collection</span></code></a>
589 </h4></div></div></div>
590 <div class="toc"><dl class="toc">
591 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle.environment">Visual
592 Studio 2015 x86</a></span></dt>
593 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle.environment0">Visual
594 Studio 2015 x64</a></span></dt>
595 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle.environment1">GCC
596 6.3 x64</a></span></dt>
597 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle.environment2">Clang
598 4.0 x64</a></span></dt>
600 <div class="section">
601 <div class="titlepage"><div><div><h5 class="title">
602 <a name="poly_collection.performance.processing_tests.results_for_boost_function_colle.environment"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle.environment" title="Visual Studio 2015 x86">Visual
604 </h5></div></div></div>
606 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_function_vs2015_x86.png"></span>
608 <span class="aligncenter"><span class="bold"><strong>Processing, Visual Studio
609 2015 x86</strong></span></span>
612 <div class="section">
613 <div class="titlepage"><div><div><h5 class="title">
614 <a name="poly_collection.performance.processing_tests.results_for_boost_function_colle.environment0"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle.environment0" title="Visual Studio 2015 x64">Visual
616 </h5></div></div></div>
618 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_function_vs2015_x64.png"></span>
620 <span class="aligncenter"><span class="bold"><strong>Processing, Visual Studio
621 2015 x64</strong></span></span>
624 <div class="section">
625 <div class="titlepage"><div><div><h5 class="title">
626 <a name="poly_collection.performance.processing_tests.results_for_boost_function_colle.environment1"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle.environment1" title="GCC 6.3 x64">GCC
628 </h5></div></div></div>
630 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_function_gcc63_x64.png"></span>
632 <span class="aligncenter"><span class="bold"><strong>Processing, GCC 6.3
633 x64</strong></span></span>
636 <div class="section">
637 <div class="titlepage"><div><div><h5 class="title">
638 <a name="poly_collection.performance.processing_tests.results_for_boost_function_colle.environment2"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_function_colle.environment2" title="Clang 4.0 x64">Clang
640 </h5></div></div></div>
642 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_function_clang40_x64.png"></span>
644 <span class="aligncenter"><span class="bold"><strong>Processing, Clang 4.0
645 x64</strong></span></span>
649 <div class="section">
650 <div class="titlepage"><div><div><h4 class="title">
651 <a name="poly_collection.performance.processing_tests.results_for_boost_any_collection"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection" title="Results for boost::any_collection">Results
652 for <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">any_collection</span></code></a>
653 </h4></div></div></div>
654 <div class="toc"><dl class="toc">
655 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection.environment">Visual
656 Studio 2015 x86</a></span></dt>
657 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection.environment0">Visual
658 Studio 2015 x64</a></span></dt>
659 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection.environment1">GCC
660 6.3 x64</a></span></dt>
661 <dt><span class="section"><a href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection.environment2">Clang
662 4.0 x64</a></span></dt>
664 <div class="section">
665 <div class="titlepage"><div><div><h5 class="title">
666 <a name="poly_collection.performance.processing_tests.results_for_boost_any_collection.environment"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection.environment" title="Visual Studio 2015 x86">Visual
668 </h5></div></div></div>
670 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_any_vs2015_x86.png"></span>
672 <span class="aligncenter"><span class="bold"><strong>Processing, Visual Studio
673 2015 x86</strong></span></span>
676 <div class="section">
677 <div class="titlepage"><div><div><h5 class="title">
678 <a name="poly_collection.performance.processing_tests.results_for_boost_any_collection.environment0"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection.environment0" title="Visual Studio 2015 x64">Visual
680 </h5></div></div></div>
682 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_any_vs2015_x64.png"></span>
684 <span class="aligncenter"><span class="bold"><strong>Processing, Visual Studio
685 2015 x64</strong></span></span>
688 <div class="section">
689 <div class="titlepage"><div><div><h5 class="title">
690 <a name="poly_collection.performance.processing_tests.results_for_boost_any_collection.environment1"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection.environment1" title="GCC 6.3 x64">GCC
692 </h5></div></div></div>
694 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_any_gcc63_x64.png"></span>
696 <span class="aligncenter"><span class="bold"><strong>Processing, GCC 6.3
697 x64</strong></span></span>
700 <div class="section">
701 <div class="titlepage"><div><div><h5 class="title">
702 <a name="poly_collection.performance.processing_tests.results_for_boost_any_collection.environment2"></a><a class="link" href="performance.html#poly_collection.performance.processing_tests.results_for_boost_any_collection.environment2" title="Clang 4.0 x64">Clang
704 </h5></div></div></div>
706 <span class="aligncenter"><span class="inlinemediaobject"><img src="img/for_each_any_clang40_x64.png"></span>
708 <span class="aligncenter"><span class="bold"><strong>Processing, Clang 4.0
709 x64</strong></span></span>
714 <div class="footnotes">
715 <br><hr style="width:100; text-align:left;margin-left: 0">
716 <div id="ftn.poly_collection.performance.processing_tests.f0" class="footnote"><p><a href="#poly_collection.performance.processing_tests.f0" class="para"><sup class="para">[21] </sup></a>
717 This has been verified empirically: simpler cycles did indeed yield
718 better execution times.
722 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
723 <td align="left"></td>
724 <td align="right"><div class="copyright-footer">Copyright © 2016-2019 Joaquín
725 M López Muñoz<p>
726 Distributed under the Boost Software License, Version 1.0. (See accompanying
727 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>)
732 <div class="spirit-nav">
733 <a accesskey="p" href="tutorial.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../poly_collection.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="reference.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>