-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml"><head><title>Testing</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1"/><meta name="keywords" content=" 	ISO C++ , 	policy , 	container , 	data , 	structure , 	associated , 	tree , 	trie , 	hash , 	metaprogramming "/><meta name="keywords" content=" ISO C++ , library "/><meta name="keywords" content=" ISO C++ , runtime , library "/><link rel="home" href="../index.html" title="The GNU C++ Library"/><link rel="up" href="policy_data_structures.html" title="Chapter 22. Policy-Based Data Structures"/><link rel="prev" href="policy_data_structures_design.html" title="Design"/><link rel="next" href="policy_data_structures_biblio.html" title="Acknowledgments"/></head><body><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Testing</th></tr><tr><td align="left"><a accesskey="p" href="policy_data_structures_design.html">Prev</a> </td><th width="60%" align="center">Chapter 22. Policy-Based Data Structures</th><td align="right"> <a accesskey="n" href="policy_data_structures_biblio.html">Next</a></td></tr></table><hr/></div><div class="section" title="Testing"><div class="titlepage"><div><div><h2 class="title"><a id="pbds.test"/>Testing</h2></div></div></div><div class="section" title="Regression"><div class="titlepage"><div><div><h3 class="title"><a id="pbds.test.regression"/>Regression</h3></div></div></div><p>The library contains a single comprehensive regression test.
+<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title>Testing</title><meta name="generator" content="DocBook XSL-NS Stylesheets V1.76.1"><meta name="keywords" content="
+ ISO C++
+ ,
+ policy
+ ,
+ container
+ ,
+ data
+ ,
+ structure
+ ,
+ associated
+ ,
+ tree
+ ,
+ trie
+ ,
+ hash
+ ,
+ metaprogramming
+ "><meta name="keywords" content="
+ ISO C++
+ ,
+ library
+ "><meta name="keywords" content="
+ ISO C++
+ ,
+ runtime
+ ,
+ library
+ "><link rel="home" href="../index.html" title="The GNU C++ Library"><link rel="up" href="policy_data_structures.html" title="Chapter 22. Policy-Based Data Structures"><link rel="prev" href="policy_data_structures_design.html" title="Design"><link rel="next" href="policy_data_structures_biblio.html" title="Acknowledgments"></head><body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"><div class="navheader"><table width="100%" summary="Navigation header"><tr><th colspan="3" align="center">Testing</th></tr><tr><td width="20%" align="left"><a accesskey="p" href="policy_data_structures_design.html">Prev</a> </td><th width="60%" align="center">Chapter 22. Policy-Based Data Structures</th><td width="20%" align="right"> <a accesskey="n" href="policy_data_structures_biblio.html">Next</a></td></tr></table><hr></div><div class="section" title="Testing"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a name="pbds.test"></a>Testing</h2></div></div></div><div class="section" title="Regression"><div class="titlepage"><div><div><h3 class="title"><a name="pbds.test.regression"></a>Regression</h3></div></div></div><p>The library contains a single comprehensive regression test.
For a given container type in this library, the test creates
an object of the container type and an object of the
corresponding standard type (e.g., <code class="classname">std::set</code>). It
this library's containers and the containers' value-types are
configured to use this allocator.</p><p>For granularity, the test is split into the
several sources, each checking only some containers.</p><p>For more details, consult the files in
- <code class="filename">testsuite/ext/pb_ds/regression</code>.</p></div><div class="section" title="Performance"><div class="titlepage"><div><div><h3 class="title"><a id="pbds.test.performance"/>Performance</h3></div></div></div><div class="section" title="Hash-Based"><div class="titlepage"><div><div><h4 class="title"><a id="performance.hash"/>Hash-Based</h4></div></div></div><p/><div class="section" title="Text find"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.text_find"/>
+ <code class="filename">testsuite/ext/pb_ds/regression</code>.</p></div><div class="section" title="Performance"><div class="titlepage"><div><div><h3 class="title"><a name="pbds.test.performance"></a>Performance</h3></div></div></div><div class="section" title="Hash-Based"><div class="titlepage"><div><div><h4 class="title"><a name="performance.hash"></a>Hash-Based</h4></div></div></div><p></p><div class="section" title="Text find"><div class="titlepage"><div><div><h5 class="title"><a name="performance.hash.text_find"></a>
Text <code class="function">find</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.text_find.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="hash.text_find.info"></a>
Description
</h6></div></div></div><p>
This test inserts a number of values with keys from an
</code>
</p><p>The test checks the effect of different range-hashing
functions, trigger policies, and cache-hashing policies.
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.text_find.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="hash.text_find.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for the native
and collision-chaining hash types the the function
applied being a text find timing test using
<code class="function">find</code>.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_hash_text_find.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_hash_text_find.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div2_sth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div2_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.text_find.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="hash.text_find.observations"></a>
Observations
</h6></div></div></div><p>In this setting, the range-hashing scheme affects performance
more than other policies. As the results show, containers using
library's implementation. (Unfortunately, it was not possible to run
the tests with <code class="classname">std::tr1::unordered_map</code> 's
<code class="classname">cache_hash_code = true</code> , as it appeared to
- malfuntion.)</p></div></div><div class="section" title="Integer find"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.int_find"/>
+ malfuntion.)</p></div></div><div class="section" title="Integer find"><div class="titlepage"><div><div><h5 class="title"><a name="performance.hash.int_find"></a>
Integer <code class="function">find</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_find.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_find.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with uniform
integer keys into a container, then performs a series of finds
</code>
</p><p>The test checks the effect of different underlying
hash-tables,
- range-hashing functions, and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_find.results"/>
+ range-hashing functions, and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_find.results"></a>
Results
</h6></div></div></div><p>
There are two sets of results for this type, one for
</p><p>The first graphic below shows the results for the native and
collision-chaining hash types. The function applied being a random
integer timing test using <code class="function">find</code>.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_cc_hash_int_find.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_cc_hash_int_find.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div2_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div2_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>
</p><p>And the second graphic shows the results for the native and
general-probe hash types. The function applied being a random
integer timing test using <code class="function">find</code>.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_gp_hash_int_find.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_gp_hash_int_find.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
gp_hash_mod_quadp_prime_1div2_nsth_map
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">gp_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Probe_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">quadratic_probe_fn</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
gp_hash_mask_linp_exp_1div2_nsth_map
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
gp_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Probe_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">linear_probe_fn</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_find.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_find.observations"></a>
Observations
</h6></div></div></div><p>In this setting, the choice of underlying hash-table affects
performance most, then the range-hashing scheme and, only finally,
above graphics should be noted that
<code class="classname">std::tr1::unordered_map</code> are hard-wired
currently to mod-based schemes.
- </p></div></div><div class="section" title="Integer Subscript find"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.int_subscript_find"/>
+ </p></div></div><div class="section" title="Integer Subscript find"><div class="titlepage"><div><div><h5 class="title"><a name="performance.hash.int_subscript_find"></a>
Integer Subscript <code class="function">find</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_find.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_subscript_find.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with uniform
integer keys into a container, then performs a series of finds
performance/ext/pb_ds/random_int_subscript_find_timing.cc
</code>
</p><p>The test checks the effect of different underlying
- hash-tables, range-hashing functions, and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_find.results"/>
+ hash-tables, range-hashing functions, and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_subscript_find.results"></a>
Results
</h6></div></div></div><p>
There are two sets of results for this type, one for
and collision-chaining hash types, using as the function
applied an integer subscript timing test with
<code class="function">find</code>.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_cc_hash_int_subscript_find.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_cc_hash_int_subscript_find.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div2_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div2_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>
</p><p>And the second graphic shows the results for the native and
general-probe hash types. The function applied being a random
integer timing test using <code class="function">find</code>.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_gp_hash_int_subscript_find.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_gp_hash_int_subscript_find.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
gp_hash_mod_quadp_prime_1div2_nsth_map
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">gp_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Probe_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">quadratic_probe_fn</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
gp_hash_mask_linp_exp_1div2_nsth_map
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
gp_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Probe_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">linear_probe_fn</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_find.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_subscript_find.observations"></a>
Observations
</h6></div></div></div><p>This test shows similar results to Hash-Based
- Integer <code class="classname">find</code> Find Timing test.</p></div></div><div class="section" title="Integer Subscript insert"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.int_subscript_insert"/>
+ Integer <code class="classname">find</code> Find Timing test.</p></div></div><div class="section" title="Integer Subscript insert"><div class="titlepage"><div><div><h5 class="title"><a name="performance.hash.int_subscript_insert"></a>
Integer Subscript <code class="function">insert</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_insert.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_subscript_insert.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with uniform i.i.d.
integer keys into a container, using
performance/ext/pb_ds/random_int_subscript_insert_timing.cc
</code>
</p><p>The test checks the effect of different underlying
- hash-tables.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_insert.results"/>
+ hash-tables.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_subscript_insert.results"></a>
Results
</h6></div></div></div><p>
There are two sets of results for this type, one for
and collision-chaining hash types, using as the function
applied an integer subscript timing test with
<code class="function">insert</code>.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_cc_hash_int_subscript_insert.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_cc_hash_int_subscript_insert.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div2_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div2_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>
</p><p>And the second graphic shows the results for the native and
general-probe hash types. The function applied being a random
integer timing test using <code class="function">find</code>.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_gp_hash_int_subscript_insert.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_gp_hash_int_subscript_insert.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
gp_hash_mod_quadp_prime_1div2_nsth_map
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">gp_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Probe_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">quadratic_probe_fn</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
gp_hash_mask_linp_exp_1div2_nsth_map
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
gp_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Probe_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">linear_probe_fn</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.int_subscript_insert.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="hash.int_subscript_insert.observations"></a>
Observations
</h6></div></div></div><p>In this setting, as in Hash-Based Text
<code class="function">find</code> Find Timing test and Hash-Based
Integer <code class="function">find</code> Find Timing test , the choice
of underlying hash-table underlying hash-table affects performance
most, then the range-hashing scheme, and
- finally any other policies.</p><p>There are some differences, however:</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>In this setting, probing tables function sometimes more
+ finally any other policies.</p><p>There are some differences, however:</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>In this setting, probing tables function sometimes more
efficiently than collision-chaining tables.
This is explained shortly.</p></li><li class="listitem"><p>The performance graphs have a "saw-tooth" shape. The
average insert time rises and falls. As values are inserted
<code class="function">find</code> Find Timing Test and Hash-Based
Integer <code class="function">find</code> Find Timing Test.
Unsurprisingly, however, containers with lower α<sub>max</sub> perform worse in this case,
- since more re-hashes are performed.</p></div></div><div class="section" title="Integer find with Skewed-Distribution"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.zlob_int_find"/>
+ since more re-hashes are performed.</p></div></div><div class="section" title="Integer find with Skewed-Distribution"><div class="titlepage"><div><div><h5 class="title"><a name="performance.hash.zlob_int_find"></a>
Integer <code class="function">find</code> with Skewed-Distribution
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.zlob_int_find.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="hash.zlob_int_find.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with a markedly
non-uniform integer keys into a container, then performs
performance/ext/pb_ds/hash_zlob_random_int_find_timing.cc
</code>
</p><p>The test checks the effect of different range-hashing
- functions and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.zlob_int_find.results"/>
+ functions and trigger policies.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="hash.zlob_int_find.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for the native, collision-chaining, and general-probing hash types.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_hash_zlob_int_find.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_hash_zlob_int_find.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
gp_hash_mod_quadp_prime_1div2_nsth_map
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">gp_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Probe_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">quadratic_probe_fn</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.zlob_int_find.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="hash.zlob_int_find.observations"></a>
Observations
</h6></div></div></div><p>In this setting, the distribution of keys is so skewed that
the underlying hash-table type affects performance marginally.
performance is bad, a χ<sup>2</sup> test can be used
to check how to transform it into a more uniform
distribution.</p><p>For this reason, this library's default range-hashing
- function is mask-based.</p></div></div><div class="section" title="Erase Memory Use"><div class="titlepage"><div><div><h5 class="title"><a id="performance.hash.erase_mem"/>
+ function is mask-based.</p></div></div><div class="section" title="Erase Memory Use"><div class="titlepage"><div><div><h5 class="title"><a name="performance.hash.erase_mem"></a>
Erase Memory Use
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="hash.erase_mem.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="hash.erase_mem.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of uniform integer keys
into a container, then erases all keys except one. It measures
performance/ext/pb_ds/hash_random_int_erase_mem_usage.cc
</code>
</p><p>The test checks how containers adjust internally as their
- logical size decreases.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="hash.erase_mem.results"/>
+ logical size decreases.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="hash.erase_mem.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for the native, collision-chaining, and general-probing hash types.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_hash_int_erase_mem.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_hash_int_erase_mem.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
n_hash_map_ncah
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_map</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">cache_hash_code</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="constant">false</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mod_prime_1div1_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mod_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_prime_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/1
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
cc_hash_mask_exp_1div2_nsth_map
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="5" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="5" align="left">
gp_hash_mask_linp_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">gp_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Probe_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">linear_probe_fn</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="hash.erase_mem.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="hash.erase_mem.observations"></a>
Observations
</h6></div></div></div><p>The standard's hash-based containers act very differently than trees in
this respect. When erasing numerous keys from an standard
depending on whether the container is tree-based or hash-based.
This is a fundamental consequence of the standard's interface for
associative containers, and it is not due to a specific
- implementation.</p></div></div></div><div class="section" title="Branch-Based"><div class="titlepage"><div><div><h4 class="title"><a id="performance.branch"/>Branch-Based</h4></div></div></div><p/><div class="section" title="Text insert"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.text_insert"/>
+ implementation.</p></div></div></div><div class="section" title="Branch-Based"><div class="titlepage"><div><div><h4 class="title"><a name="performance.branch"></a>Branch-Based</h4></div></div></div><p></p><div class="section" title="Text insert"><div class="titlepage"><div><div><h5 class="title"><a name="performance.branch.text_insert"></a>
Text <code class="function">insert</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_insert.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_insert.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an arbitrary
text ([ wickland96thirty ]) into a container
<code class="filename">
performance/ext/pb_ds/tree_text_insert_timing.cc
</code>
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_insert.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_insert.results"></a>
Results
</h6></div></div></div><p>The three graphics below show the results for the native
tree and this library's node-based trees, the native tree and
and this library's PATRICIA-trie, respectively.
</p><p>The graphic immediately below shows the results for the
native tree type and several node-based tree types.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_insert_node.png" style="text-align: middle"/></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_tree_text_insert_node.png" align="middle"></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p></div><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p></div><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_map
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::map</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
splay_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">splay_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rb_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
</td></tr></tbody></table></div><p>The graphic below shows the results for the
native tree type and a vector-based tree type.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_insert_vector.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_tree_text_insert_vector.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_map
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::map</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
ov_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">ov_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
</td></tr></tbody></table></div><p>The graphic below shows the results for the
native tree type and a PATRICIA trie type.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_insert_trie.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_tree_text_insert_trie.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_map
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::map</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pat_trie_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pat_trie_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_insert.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_insert.observations"></a>
Observations
</h6></div></div></div><p>Observing the first graphic implies that for this setting, a splay tree
(<code class="classname">tree</code> with <code class="classname">Tag
encountered, a new "hash-table" is built A large fan-out PATRICIA
trie, however, doe does well in look-ups (see Branch-Based
Text <code class="function">find</code> Find Timing Test). It may be
- beneficial in semi-static settings.</p></div></div><div class="section" title="Text find"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.text_find"/>
+ beneficial in semi-static settings.</p></div></div><div class="section" title="Text find"><div class="titlepage"><div><div><h5 class="title"><a name="performance.branch.text_find"></a>
Text <code class="function">find</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_find.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_find.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an
arbitrary text ([wickland96thirty]) into
performance/ext/pb_ds/text_find_timing.cc
</code>
</p><p>The test checks the effect of different underlying
- data structures.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_find.results"/>
+ data structures.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_find.results"></a>
Results
</h6></div></div></div><p>The graphic immediately below shows the results for the
native tree type and several other tree types.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_find.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_tree_text_find.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_map
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::map</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
splay_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">splay_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rb_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
ov_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">ov_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pat_trie_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pat_trie_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_find.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_find.observations"></a>
Observations
</h6></div></div></div><p>For this setting, a splay tree (<code class="classname">tree</code>
with <code class="classname">Tag
</code> = <code class="classname">splay_tree_tag</code>) does not do
- well. This is possibly due to two reasons:</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>A splay tree is not guaranteed to be balanced [motwani95random]. If a
+ well. This is possibly due to two reasons:</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>A splay tree is not guaranteed to be balanced [motwani95random]. If a
splay tree contains n nodes, its average root-leaf
path can be m >> log(n).</p></li><li class="listitem"><p>Assume a specific root-leaf search path has length
m, and the search-target node has distance m'
by a sub-trie. A large-fan-out PATRICIA trie does not do well on
modifications (see Tree-Based and Trie-Based
Text Insert Timing Test). Therefore, it is possibly beneficial in
- semi-static settings.</p></div></div><div class="section" title="Text find with Locality-of-Reference"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.text_lor_find"/>
+ semi-static settings.</p></div></div><div class="section" title="Text find with Locality-of-Reference"><div class="titlepage"><div><div><h5 class="title"><a name="performance.branch.text_lor_find"></a>
Text <code class="function">find</code> with Locality-of-Reference
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_lor_find.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_lor_find.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an
arbitrary text ([ wickland96thirty ]) into
performance/ext/pb_ds/tree_text_lor_find_timing.cc
</code>
</p><p>The test checks the effect of different underlying
- data structures in a locality-of-reference setting.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_lor_find.results"/>
+ data structures in a locality-of-reference setting.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_lor_find.results"></a>
Results
</h6></div></div></div><p>The graphic immediately below shows the results for the
native tree type and several other tree types.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_text_lor_find.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_tree_text_lor_find.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_map
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::map</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
splay_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">splay_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rb_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
ov_tree_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">ov_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pat_trie_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pat_trie_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.text_lor_find.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="branch.text_lor_find.observations"></a>
Observations
</h6></div></div></div><p>For this setting, an ordered-vector tree
(<code class="classname">tree</code> with <code class="classname">Tag</code>
tree all share approximately the same performance.</p><p>A splay tree (<code class="classname">tree</code>
with <code class="classname">Tag</code> = <code class="classname">splay_tree_tag</code>) does
much better, since each (successful) find "bubbles" the
- corresponding node to the root of the tree.</p></div></div><div class="section" title="split and join"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.split_join"/>
+ corresponding node to the root of the tree.</p></div></div><div class="section" title="split and join"><div class="titlepage"><div><div><h5 class="title"><a name="performance.branch.split_join"></a>
<code class="function">split</code> and <code class="function">join</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.split_join.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="branch.split_join.info"></a>
Description
</h6></div></div></div><p>This test a container, inserts into a number of values, splits
the container at the median, and joins the two containers. (If the
implication, this test checks the most efficient way to erase a
sub-sequence from a tree-like-based container, since this can
always be performed by a small sequence of splits and joins.
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.split_join.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="branch.split_join.results"></a>
Results
</h6></div></div></div><p>The graphic immediately below shows the results for the
native tree type and several other tree types.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_split_join.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_tree_split_join.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_set
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::set</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
splay_tree_set
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">splay_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rb_tree_set
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
ov_tree_set
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">ov_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pat_trie_map
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pat_trie_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.split_join.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="branch.split_join.observations"></a>
Observations
</h6></div></div></div><p>In this test, the native red-black trees must be split and
joined externally, through a sequence of <code class="function">erase</code> and
via <code class="classname">container_traits</code>).</p><p>It is important to note that <code class="function">split</code> and
<code class="function">join</code> are not esoteric methods - they are the most
efficient means of erasing a contiguous range of values from a
- tree based container.</p></div></div><div class="section" title="Order-Statistics"><div class="titlepage"><div><div><h5 class="title"><a id="performance.branch.order_statistics"/>
+ tree based container.</p></div></div><div class="section" title="Order-Statistics"><div class="titlepage"><div><div><h5 class="title"><a name="performance.branch.order_statistics"></a>
Order-Statistics
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="branch.order_statistics.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="branch.order_statistics.info"></a>
Description
</h6></div></div></div><p>This test creates a container, inserts random integers into the
the container, and then checks the order-statistics of the
performance/ext/pb_ds/tree_order_statistics_timing.cc
</code>
</p><p>The test checks the performance difference of policies based
- on node-invariant as opposed to a external functions.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="branch.order_statistics.results"/>
+ on node-invariant as opposed to a external functions.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="branch.order_statistics.results"></a>
Results
</h6></div></div></div><p>The graphic immediately below shows the results for the
native tree type and several other tree types.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_tree_order_statistics.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_tree_order_statistics.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_set
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::set</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
splay_tree_ost_set
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">splay_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">tree_order_statistics_node_update</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rb_tree_ost_set
- </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">tree_order_statistics_node_update</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="branch.order_statistics.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="branch.order_statistics.observations"></a>
Observations
</h6></div></div></div><p>In this test, the native red-black tree can support
order-statistics queries only externally, by performing a
tree (<code class="classname">tree</code>
with <code class="classname">Tag =</code> <code class="classname">rb_tree_tag</code> ) is
logarithmic in the number of elements. Consequently, the splay
- tree has worse performance than the red-black tree.</p></div></div></div><div class="section" title="Multimap"><div class="titlepage"><div><div><h4 class="title"><a id="performance.multimap"/>Multimap</h4></div></div></div><p/><div class="section" title="Text find with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_find_small"/>
+ tree has worse performance than the red-black tree.</p></div></div></div><div class="section" title="Multimap"><div class="titlepage"><div><div><h4 class="title"><a name="performance.multimap"></a>Multimap</h4></div></div></div><p></p><div class="section" title="Text find with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a name="performance.multimap.text_find_small"></a>
Text <code class="function">find</code> with Small Secondary-to-Primary Key Ratios
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_small.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_find_small.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of pairs into a container. The
first item of each pair is a string from an arbitrary text
performance/ext/pb_ds/multimap_text_find_timing_small.cc
</code>
</p><p>The test checks the find-time scalability of different
- "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_small.results"/>
+ "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_find_small.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for "multimaps" which
use a tree-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_small_s2p_tree.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_find_small_s2p_tree.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="5" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
use a hash-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_small_s2p_hash.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_find_small_s2p_hash.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_hash_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="6" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_small.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_find_small.observations"></a>
Observations
</h6></div></div></div><p>See Observations::Mapping-Semantics
- Considerations.</p></div></div><div class="section" title="Text find with Large Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_find_large"/>
+ Considerations.</p></div></div><div class="section" title="Text find with Large Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a name="performance.multimap.text_find_large"></a>
Text <code class="function">find</code> with Large Secondary-to-Primary Key Ratios
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_large.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_find_large.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of pairs into a container. The
first item of each pair is a string from an arbitrary text
performance/ext/pb_ds/multimap_text_find_timing_large.cc
</code>
</p><p>The test checks the find-time scalability of different
- "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_large.results"/>
+ "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_find_large.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for "multimaps" which
use a tree-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_tree.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_find_large_s2p_tree.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="5" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
use a hash-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_hash_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="6" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_find_large.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_find_large.observations"></a>
Observations
</h6></div></div></div><p>See Observations::Mapping-Semantics
- Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_insert_small"/>
+ Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a name="performance.multimap.text_insert_small"></a>
Text <code class="function">insert</code> with Small
Secondary-to-Primary Key Ratios
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_small.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_small.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of pairs into a container. The
first item of each pair is a string from an arbitrary text
performance/ext/pb_ds/multimap_text_insert_timing_small.cc
</code>
</p><p>The test checks the insert-time scalability of different
- "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_small.results"/>
+ "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_small.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for "multimaps" which
use a tree-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_insert_small_s2p_tree.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_insert_small_s2p_tree.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="5" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
use a hash-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_small_s2p_hash.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_find_small_s2p_hash.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_hash_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="6" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_small.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_small.observations"></a>
Observations
</h6></div></div></div><p>See Observations::Mapping-Semantics
- Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_insert_large"/>
+ Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios"><div class="titlepage"><div><div><h5 class="title"><a name="performance.multimap.text_insert_large"></a>
Text <code class="function">insert</code> with Small
Secondary-to-Primary Key Ratios
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_large.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_large.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of pairs into a container. The
first item of each pair is a string from an arbitrary text
performance/ext/pb_ds/multimap_text_insert_timing_large.cc
</code>
</p><p>The test checks the insert-time scalability of different
- "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_large.results"/>
+ "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_large.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for "multimaps" which
use a tree-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_insert_large_s2p_tree.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_insert_large_s2p_tree.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="5" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
use a hash-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_hash_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="6" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_large.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_large.observations"></a>
Observations
</h6></div></div></div><p>See Observations::Mapping-Semantics
- Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios Memory Use"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_insert_mem_small"/>
+ Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios Memory Use"><div class="titlepage"><div><div><h5 class="title"><a name="performance.multimap.text_insert_mem_small"></a>
Text <code class="function">insert</code> with Small
Secondary-to-Primary Key Ratios Memory Use
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_small.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_mem_small.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of pairs into a container. The
first item of each pair is a string from an arbitrary text
performance/ext/pb_ds/multimap_text_insert_mem_usage_small.cc
</code>
</p><p>The test checks the memory scalability of different
- "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_small.results"/>
+ "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_mem_small.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for "multimaps" which
use a tree-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_insert_mem_small_s2p_tree.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_insert_mem_small_s2p_tree.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="5" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
use a hash-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_hash_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="6" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_small.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_mem_small.observations"></a>
Observations
</h6></div></div></div><p>See Observations::Mapping-Semantics
- Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios Memory Use"><div class="titlepage"><div><div><h5 class="title"><a id="performance.multimap.text_insert_mem_large"/>
+ Considerations.</p></div></div><div class="section" title="Text insert with Small Secondary-to-Primary Key Ratios Memory Use"><div class="titlepage"><div><div><h5 class="title"><a name="performance.multimap.text_insert_mem_large"></a>
Text <code class="function">insert</code> with Small
Secondary-to-Primary Key Ratios Memory Use
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_large.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_mem_large.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of pairs into a container. The
first item of each pair is a string from an arbitrary text
performance/ext/pb_ds/multimap_text_insert_mem_usage_large.cc
</code>
</p><p>The test checks the memory scalability of different
- "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_large.results"/>
+ "multimap" designs.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_mem_large.results"></a>
Results
</h6></div></div></div><p>The graphic below show the results for "multimaps" which
use a tree-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_insert_mem_large_s2p_tree.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_insert_mem_large_s2p_tree.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="5" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="5" align="left" valign="top">
<code class="classname">tree</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rb_tree_tag</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="4" align="left"> </td></tr><tr><td align="left">
<code class="classname">Node_Update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">null_node_update</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
</td></tr></tbody></table></div><p>The graphic below show the results for "multimaps" which
use a hash-based container for primary keys.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_multimap_text_find_large_s2p_hash.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/><col style="text-align: left" class="c7"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"><col align="left" class="c7"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
n_hash_mmap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::tr1::unordered_multimap</code>
- </td><td colspan="6" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="6" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_lu_mtf_set
- </td></tr><tr><td rowspan="4" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="4" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left">
<code class="classname">Mapped</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">list_update</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Update_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">lu_move_to_front_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr style="background-color: #B0B0B0"><td colspan="7" style="text-align: left">
+ </td><td colspan="2" align="left"> </td></tr><tr bgcolor="#B0B0B0"><td colspan="7" align="left">
rb_tree_mmap_cc_hash_mask_exp_1div2_nsth_set
- </td></tr><tr><td rowspan="6" style="text-align: left" valign="top">
+ </td></tr><tr><td rowspan="6" align="left" valign="top">
<code class="classname">
cc_hash_table
</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="4" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="4" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="3" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="3" align="left" valign="top">
<code class="classname">Mapped</code>
- </td><td rowspan="3" style="text-align: left" valign="top">
+ </td><td rowspan="3" align="left" valign="top">
<code class="classname">cc_hash_table</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Comb_Hash_Fn</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">direct_mask_range_hashing</code>
- </td><td colspan="2" style="text-align: left"> </td></tr><tr><td rowspan="2" style="text-align: left" valign="top">
+ </td><td colspan="2" align="left"> </td></tr><tr><td rowspan="2" align="left" valign="top">
<code class="classname">Resize_Policy</code>
- </td><td rowspan="2" style="text-align: left" valign="top">
+ </td><td rowspan="2" align="left" valign="top">
<code class="classname">hash_standard_resize_policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Size_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_exponential_size_policy</code>
- </td></tr><tr><td style="text-align: left" valign="top">
+ </td></tr><tr><td align="left" valign="top">
<code class="classname">Trigger_Policy</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">hash_load_check_resize_trigger</code> with
α<sub>min</sub> = 1/8 and α<sub>max</sub> = 1/2
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="multimap.text_insert_mem_large.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="multimap.text_insert_mem_large.observations"></a>
Observations
</h6></div></div></div><p>See Observations::Mapping-Semantics
- Considerations.</p></div></div></div><div class="section" title="Priority Queue"><div class="titlepage"><div><div><h4 class="title"><a id="performance.priority_queue"/>Priority Queue</h4></div></div></div><div class="section" title="Text push"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_push"/>
+ Considerations.</p></div></div></div><div class="section" title="Priority Queue"><div class="titlepage"><div><div><h4 class="title"><a name="performance.priority_queue"></a>Priority Queue</h4></div></div></div><div class="section" title="Text push"><div class="titlepage"><div><div><h5 class="title"><a name="performance.priority_queue.text_push"></a>
Text <code class="function">push</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_push.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an
arbitrary text ([ wickland96thirty ]) into
</code>
</p><p>The test checks the effect of different underlying data
structures.
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_push.results"></a>
Results
</h6></div></div></div><p>The two graphics below show the results for the native
priority_queues and this library's priority_queues.
native priority_queue type instantiated with different underlying
container types versus several different versions of library's
priority_queues.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_push.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_priority_queue_text_push.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rc_binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rc_binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
</td></tr></tbody></table></div><p>The graphic below shows the results for the binary-heap
based native priority queues and this library's pairing-heap
priority_queue data structures.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_pairing_priority_queue_text_push.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_pairing_priority_queue_text_push.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_push.observations"></a>
Observations
</h6></div></div></div><p>Pairing heaps (<code class="classname">priority_queue</code> with
<code class="classname">Tag</code> = <code class="classname">pairing_heap_tag</code>)
operation, and the deque implementation is possibly hampered by
its need to manipulate a relatively-complex type (deques
support a O(1) <code class="function">push_front</code>, even though it is
- not used by <code class="classname">std::priority_queue</code>.)</p></div></div><div class="section" title="Text push and pop"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_push_pop"/>
+ not used by <code class="classname">std::priority_queue</code>.)</p></div></div><div class="section" title="Text push and pop"><div class="titlepage"><div><div><h5 class="title"><a name="performance.priority_queue.text_push_pop"></a>
Text <code class="function">push</code> and <code class="function">pop</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push_pop.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_push_pop.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an
arbitrary text ([ wickland96thirty ]) into
</code>
</p><p>The test checks the effect of different underlying data
structures.
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push_pop.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_push_pop.results"></a>
Results
</h6></div></div></div><p>The two graphics below show the results for the native
priority_queues and this library's priority_queues.
native priority_queue type instantiated with different underlying
container types versus several different versions of library's
priority_queues.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_push_pop.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_priority_queue_text_push_pop.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rc_binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rc_binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
</td></tr></tbody></table></div><p>The graphic below shows the results for the native priority
queues and this library's pairing-heap priority_queue data
structures.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_pairing_priority_queue_text_push_pop.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_pairing_priority_queue_text_push_pop.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code> adapting <code class="classname">std::vector</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_push_pop.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_push_pop.observations"></a>
Observations
</h6></div></div></div><p>These results are very similar to Priority Queue Text
<code class="function">push</code> Timing Test. As stated there, pairing heaps
of <code class="function">push</code> operations, pairing heaps are better
in this case. See Priority Queue Random
Integer <code class="function">push</code> and <code class="function">pop</code>
- Timing Test for a case which is different.</p></div></div><div class="section" title="Integer push"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.int_push"/>
+ Timing Test for a case which is different.</p></div></div><div class="section" title="Integer push"><div class="titlepage"><div><div><h5 class="title"><a name="performance.priority_queue.int_push"></a>
Integer <code class="function">push</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.int_push.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with integer keys
into a container using <code class="function">push</code>. It
</code>
</p><p>The test checks the effect of different underlying data
structures.
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.int_push.results"></a>
Results
</h6></div></div></div><p>The two graphics below show the results for the native
priority_queues and this library's priority_queues.
native priority_queue type instantiated with different underlying
container types versus several different versions of library's
priority_queues.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_int_push.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_priority_queue_int_push.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rc_binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rc_binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
</td></tr></tbody></table></div><p>The graphic below shows the results for the binary-heap
based native priority queues and this library's
priority_queue data structures.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_binary_priority_queue_int_push.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_binary_priority_queue_int_push.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code> adapting <code class="classname">std::vector</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.int_push.observations"></a>
Observations
</h6></div></div></div><p>Binary heaps are the most suited for sequences of
<code class="function">push</code> and <code class="function">pop</code> operations of primitive types
such types in arrays, they outperform even pairing heaps. (See
Priority
Queue Text <code class="function">push</code> Timing Test for the case of
- non-primitive types.)</p></div></div><div class="section" title="Integer push"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.int_push_pop"/>
+ non-primitive types.)</p></div></div><div class="section" title="Integer push"><div class="titlepage"><div><div><h5 class="title"><a name="performance.priority_queue.int_push_pop"></a>
Integer <code class="function">push</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push_pop.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.int_push_pop.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with integer keys
into a container using <code class="function">push</code> , then removes them
</code>
</p><p>The test checks the effect of different underlying data
structures.
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push_pop.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.int_push_pop.results"></a>
Results
</h6></div></div></div><p>The graphic immediately below shows the results for the
native priority_queue type instantiated with different underlying
container types versus several different versions of library's
priority_queues.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_int_push_pop.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_priority_queue_int_push_pop.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rc_binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rc_binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.int_push_pop.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.int_push_pop.observations"></a>
Observations
</h6></div></div></div><p>Binary heaps are the most suited for sequences of
<code class="function">push</code> and <code class="function">pop</code> operations of primitive types
types.)</p><p>At first glance it seems that the standard's vector-based
priority queue is approximately on par with this
library's corresponding priority queue. There are two
- differences however:</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>The standard's priority queue does not downsize the underlying
+ differences however:</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>The standard's priority queue does not downsize the underlying
vector (or deque) as the priority queue becomes smaller
(see Priority Queue
Text <code class="function">pop</code> Memory Use Test). It is therefore
the number of
<code class="function">pop</code> operations is at most that of <code class="function">push</code>
operations, the test here is the "best" for the standard's
- priority queue.</p></li></ol></div></div></div><div class="section" title="Text pop Memory Use"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_pop"/>
+ priority queue.</p></li></ol></div></div></div><div class="section" title="Text pop Memory Use"><div class="titlepage"><div><div><h5 class="title"><a name="performance.priority_queue.text_pop"></a>
Text <code class="function">pop</code> Memory Use
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_pop.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_pop.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an
arbitrary text ([ wickland96thirty ]) into
</code>
</p><p>The test checks the effect of different underlying data
structures.
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_pop.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_pop.results"></a>
Results
</h6></div></div></div><p>The graphic immediately below shows the results for the
native priority_queue type instantiated with different underlying
container types versus several different versions of library's
priority_queues.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_pop_mem.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_priority_queue_text_pop_mem.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rc_binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rc_binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_pop.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_pop.observations"></a>
Observations
</h6></div></div></div><p>The priority queue implementations (excluding the standard's) use
memory proportionally to the number of values they hold:
impede performance compared to the standard's priority
queues.</p><p>See Hash-Based Erase
Memory Use Test for a similar phenomenon regarding priority
- queues.</p></div></div><div class="section" title="Text join"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_join"/>
+ queues.</p></div></div><div class="section" title="Text join"><div class="titlepage"><div><div><h5 class="title"><a name="performance.priority_queue.text_join"></a>
Text <code class="function">join</code>
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_join.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_join.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an
arbitrary text ([ wickland96thirty ]) into
</code>
</p><p>The test checks the effect of different underlying data
structures.
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_join.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_join.results"></a>
Results
</h6></div></div></div><p>The graphic immediately below shows the results for the
native priority_queue type instantiated with different underlying
container types versus several different versions of library's
priority_queues.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_join.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_priority_queue_text_join.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rc_binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rc_binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_join.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_join.observations"></a>
Observations
</h6></div></div></div><p>In this test the node-based heaps perform <code class="function">join</code> in
either logarithmic or constant time. The binary heap requires
and <code class="function">size()</code> (since they are enough to expose
the underlying array), but this is impossible for
a <code class="classname">std::deque</code>-based standard priority queue.
- Without heapify, the cost is super-linear.</p></div></div><div class="section" title="Text modify Up"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_modify_up"/>
+ Without heapify, the cost is super-linear.</p></div></div><div class="section" title="Text modify Up"><div class="titlepage"><div><div><h5 class="title"><a name="performance.priority_queue.text_modify_up"></a>
Text <code class="function">modify</code> Up
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_up.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_modify_up.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an
arbitrary text ([ wickland96thirty ]) into
arbitrary value larger (in the sense of the priority queue's
comparison functor) corresponds to decrease-key in standard graph
algorithms [clrs2001].
- </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_up.results"/>
+ </p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_modify_up.results"></a>
Results
</h6></div></div></div><p>The two graphics below show the results for the native
priority_queues and this library's priority_queues.
native priority_queue type instantiated with different underlying
container types versus several different versions of library's
priority_queues.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_modify_up.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_priority_queue_text_modify_up.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rc_binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rc_binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
</td></tr></tbody></table></div><p>The graphic below shows the results for the
native priority queues and this library's pairing and thin heap
priority_queue data structures.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_pairing_priority_queue_text_modify_up_thin.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_pairing_priority_queue_text_modify_up_thin.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_up.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_modify_up.observations"></a>
Observations
</h6></div></div></div><p>As noted above, increasing an arbitrary value (in the sense of
the priority queue's comparison functor) is very common in
finding the appropriate value, then use the range-type iterator
for the <code class="function">modify</code> operation.</p><p>The explanation for the standard's priority queues' performance
is similar to that in Priority Queue Text
- <code class="function">join</code> Timing Test.</p></div></div><div class="section" title="Text modify Down"><div class="titlepage"><div><div><h5 class="title"><a id="performance.priority_queue.text_modify_down"/>
+ <code class="function">join</code> Timing Test.</p></div></div><div class="section" title="Text modify Down"><div class="titlepage"><div><div><h5 class="title"><a name="performance.priority_queue.text_modify_down"></a>
Text <code class="function">modify</code> Down
- </h5></div></div></div><p/><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_down.info"/>
+ </h5></div></div></div><p></p><div class="section" title="Description"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_modify_down.info"></a>
Description
</h6></div></div></div><p>This test inserts a number of values with keys from an
arbitrary text ([ wickland96thirty ]) into
performance/ext/pb_ds/priority_queue_text_modify_down_timing.cc
</code>
</p><p>The main purpose of this test is to contrast Priority Queue
- Text <code class="classname">modify</code> Up Timing Test.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_down.results"/>
+ Text <code class="classname">modify</code> Up Timing Test.</p></div><div class="section" title="Results"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_modify_down.results"></a>
Results
</h6></div></div></div><p>The two graphics below show the results for the native
priority_queues and this library's priority_queues.
native priority_queue type instantiated with different underlying
container types versus several different versions of library's
priority_queues.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_priority_queue_text_modify_down.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_priority_queue_text_modify_down.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_vector
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::vector</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
n_pq_deque
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Sequence</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">std::deque</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binary_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binary_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
rc_binomial_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">rc_binomial_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
</td></tr></tbody></table></div><p>The graphic below shows the results for the
native priority queues and this library's pairing and thin heap
priority_queue data structures.
- </p><div class="informalfigure"><div class="mediaobject" style="text-align: center"><img src="../images/pbds_pairing_priority_queue_text_modify_down_thin.png" style="text-align: middle"/></div></div><p>
+ </p><div class="informalfigure"><div class="mediaobject" align="center"><img src="../images/pbds_pairing_priority_queue_text_modify_down_thin.png" align="middle"></div></div><p>
The abbreviated names in the legend of the graphic above are
instantiated with the types in the following table.
- </p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/></colgroup><thead><tr><th style="text-align: left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th style="text-align: left"><span class="emphasis"><em>Parameter</em></span></th><th style="text-align: left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"></colgroup><thead><tr><th align="left"><span class="emphasis"><em>Name/Instantiating Type</em></span></th><th align="left"><span class="emphasis"><em>Parameter</em></span></th><th align="left"><span class="emphasis"><em>Details</em></span></th></tr></thead><tbody><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
thin_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">thin_heap_tag</code>
- </td></tr><tr style="background-color: #B0B0B0"><td colspan="3" style="text-align: left">
+ </td></tr><tr bgcolor="#B0B0B0"><td colspan="3" align="left">
pairing_heap
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">Tag</code>
- </td><td style="text-align: left">
+ </td><td align="left">
<code class="classname">pairing_heap_tag</code>
- </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a id="priority_queue.text_modify_down.observations"/>
+ </td></tr></tbody></table></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h6 class="title"><a name="priority_queue.text_modify_down.observations"></a>
Observations
</h6></div></div></div><p>Most points in these results are similar to Priority Queue
Text <code class="function">modify</code> Up Timing Test.</p><p>It is interesting to note, however, that as opposed to that
(in the sense of the priority queue's comparison functor), and
so Priority Queue
Text <code class="classname">modify</code> Up Timing Test - is more interesting
- than this test.</p></div></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h4 class="title"><a id="pbds.test.performance.observations"/>Observations</h4></div></div></div><div class="section" title="Associative"><div class="titlepage"><div><div><h5 class="title"><a id="observations.associative"/>Associative</h5></div></div></div><div class="section" title="Underlying Data-Structure Families"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.underlying"/>
+ than this test.</p></div></div></div><div class="section" title="Observations"><div class="titlepage"><div><div><h4 class="title"><a name="pbds.test.performance.observations"></a>Observations</h4></div></div></div><div class="section" title="Associative"><div class="titlepage"><div><div><h5 class="title"><a name="observations.associative"></a>Associative</h5></div></div></div><div class="section" title="Underlying Data-Structure Families"><div class="titlepage"><div><div><h6 class="title"><a name="observations.associative.underlying"></a>
Underlying Data-Structure Families
</h6></div></div></div><p>In general, hash-based containers have better timing performance
than containers based on different underlying-data structures. The
order-preservation, or the ability to utilize node invariants. If
memory-use is the major factor, an ordered-vector tree gives
optimal results (albeit with high modificiation costs), and a
- list-based container gives reasonable results.</p></div><div class="section" title="Hash-Based Containers"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.hash"/>
+ list-based container gives reasonable results.</p></div><div class="section" title="Hash-Based Containers"><div class="titlepage"><div><div><h6 class="title"><a name="observations.associative.hash"></a>
Hash-Based Containers
</h6></div></div></div><p>Hash-based containers are typically either collision
chaining or probing. Collision-chaining
useful also in multithreaded applications where each thread
manipulates a hash-based container: in the standard, allocators have
class-wise semantics (see [meyers96more] - Item 10); a
- probing container might incur less contention in this case.</p></div><div class="section" title="Hash Policies"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.hash_policies"/>
+ probing container might incur less contention in this case.</p></div><div class="section" title="Hash Policies"><div class="titlepage"><div><div><h6 class="title"><a name="observations.associative.hash_policies"></a>
Hash Policies
</h6></div></div></div><p>In hash-based containers, the range-hashing scheme seems to
affect performance more than other considerations. In most
function.</p><p>An orthogonal consideration is the trigger policy. This
presents difficult tradeoffs. E.g., different load
factors in a load-check trigger policy yield a
- space/amortized-cost tradeoff.</p></div><div class="section" title="Branch-Based Containers"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.branch"/>
+ space/amortized-cost tradeoff.</p></div><div class="section" title="Branch-Based Containers"><div class="titlepage"><div><div><h6 class="title"><a name="observations.associative.branch"></a>
Branch-Based Containers
</h6></div></div></div><p>In general, there are several families of tree-based
underlying data structures: balanced node-based trees
maintaining such trees is higher than that of balanced trees.
Moderate-fan-out trees might be useful for sequences where each
element has a limited number of choices, e.g., DNA
- strings.</p></div><div class="section" title="Mapping-Semantics"><div class="titlepage"><div><div><h6 class="title"><a id="observations.associative.mapping_semantics"/>
+ strings.</p></div><div class="section" title="Mapping-Semantics"><div class="titlepage"><div><div><h6 class="title"><a name="observations.associative.mapping_semantics"></a>
Mapping-Semantics
</h6></div></div></div><p>Different mapping semantics were discussed in the introduction and design sections.Here
the focus will be on the case where a keys can be composed into
primary keys and secondary keys. (In the case where some keys
are completely identical, it is trivial that one should use an
associative container mapping values to size types.) In this
- case there are (at least) five possibilities:</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>Use an associative container that allows equivalent-key
+ case there are (at least) five possibilities:</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>Use an associative container that allows equivalent-key
values (such as <code class="classname">std::multimap</code>)</p></li><li class="listitem"><p>Use a unique-key value associative container that maps
each primary key to some complex associative container of
secondary keys, say a tree-based or hash-based container.
but with very high constants; using 1 with a tree-based
container, the cost is Θ(nlog(mn)). Using 2, 3,
and 4, the expected cost is Θ(n), but typically
- with far lower costs than 1. 5 is similar to 1.</p></div></div><div class="section" title="Priority_Queue"><div class="titlepage"><div><div><h5 class="title"><a id="observations.priority_queue"/>Priority_Queue</h5></div></div></div><div class="section" title="Complexity"><div class="titlepage"><div><div><h6 class="title"><a id="observations.priority_queue.complexity"/>Complexity</h6></div></div></div><p>The following table shows the complexities of the different
+ with far lower costs than 1. 5 is similar to 1.</p></div></div><div class="section" title="Priority_Queue"><div class="titlepage"><div><div><h5 class="title"><a name="observations.priority_queue"></a>Priority_Queue</h5></div></div></div><div class="section" title="Complexity"><div class="titlepage"><div><div><h6 class="title"><a name="observations.priority_queue.complexity"></a>Complexity</h6></div></div></div><p>The following table shows the complexities of the different
underlying data structures in terms of orders of growth. It is
interesting to note that this table implies something about the
constants of the operations as well (see Amortized <code class="function">push</code>
- and <code class="function">pop</code> operations).</p><div class="informaltable"><table border="1"><colgroup><col style="text-align: left" class="c1"/><col style="text-align: left" class="c2"/><col style="text-align: left" class="c3"/><col style="text-align: left" class="c4"/><col style="text-align: left" class="c5"/><col style="text-align: left" class="c6"/></colgroup><thead><tr><th style="text-align: left"> </th><th style="text-align: left"><span class="emphasis"><em><code class="function">push</code></em></span></th><th style="text-align: left"><span class="emphasis"><em><code class="function">pop</code></em></span></th><th style="text-align: left"><span class="emphasis"><em><code class="function">modify</code></em></span></th><th style="text-align: left"><span class="emphasis"><em><code class="function">erase</code></em></span></th><th style="text-align: left"><span class="emphasis"><em><code class="function">join</code></em></span></th></tr></thead><tbody><tr><td style="text-align: left">
+ and <code class="function">pop</code> operations).</p><div class="informaltable"><table border="1"><colgroup><col align="left" class="c1"><col align="left" class="c2"><col align="left" class="c3"><col align="left" class="c4"><col align="left" class="c5"><col align="left" class="c6"></colgroup><thead><tr><th align="left"> </th><th align="left"><span class="emphasis"><em><code class="function">push</code></em></span></th><th align="left"><span class="emphasis"><em><code class="function">pop</code></em></span></th><th align="left"><span class="emphasis"><em><code class="function">modify</code></em></span></th><th align="left"><span class="emphasis"><em><code class="function">erase</code></em></span></th><th align="left"><span class="emphasis"><em><code class="function">join</code></em></span></th></tr></thead><tbody><tr><td align="left">
<code class="classname">std::priority_queue</code>
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n) worst
Θ(log(n)) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n)) Worst
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n log(n)) Worst
<sub>[std note 1]</sub>
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n log(n))
<sub>[std note 2]</sub>
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n log(n))
<sub>[std note 1]</sub>
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
<<code class="classname">Tag</code> =
<code class="classname">pairing_heap_tag</code>>
- </td><td style="text-align: left">
+ </td><td align="left">
O(1)
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n) worst
Θ(log(n)) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n) worst
Θ(log(n)) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n) worst
Θ(log(n)) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
O(1)
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
<<code class="classname">Tag</code> =
<code class="classname">binary_heap_tag</code>>
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n) worst
Θ(log(n)) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n) worst
Θ(log(n)) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n)
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n)
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n)
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
<<code class="classname">Tag</code> =
<code class="classname">binomial_heap_tag</code>>
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n)) worst
O(1) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n))
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n))
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n))
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n))
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code>
<<code class="classname">Tag</code> =
<code class="classname">rc_binomial_heap_tag</code>>
- </td><td style="text-align: left">
+ </td><td align="left">
O(1)
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n))
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n))
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n))
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n))
- </td></tr><tr><td style="text-align: left">
+ </td></tr><tr><td align="left">
<code class="classname">priority_queue</code><<code class="classname">Tag</code> =
<code class="classname">thin_heap_tag</code>>
- </td><td style="text-align: left">
+ </td><td align="left">
O(1)
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n) worst
Θ(log(n)) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(log(n)) worst
O(1) amortized,
or Θ(log(n)) amortized
<sub>[thin_heap_note]</sub>
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n) worst
Θ(log(n)) amortized
- </td><td style="text-align: left">
+ </td><td align="left">
Θ(n)
</td></tr></tbody></table></div><p>[std note 1] This
is not a property of the algorithm, but rather due to the fact
of the priority queue's comparison functor), then the amortized
time is O(1), but if II) it decreases it, then the
amortized time is the same as the worst case time. Note that
- for most algorithms, I) is important and II) is not.</p></div><div class="section" title="Amortized push and pop operations"><div class="titlepage"><div><div><h6 class="title"><a id="observations.priority_queue.amortized_ops"/>
+ for most algorithms, I) is important and II) is not.</p></div><div class="section" title="Amortized push and pop operations"><div class="titlepage"><div><div><h6 class="title"><a name="observations.priority_queue.amortized_ops"></a>
Amortized <code class="function">push</code>
and <code class="function">pop</code> operations
</h6></div></div></div><p>In many cases, a priority queue is needed primarily for
terms of constants.</p><p>As the table shows, the "least constrained" underlying
data structures are binary heaps and pairing heaps.
Consequently, it is not surprising that they perform best in
- terms of amortized constants.</p><div class="orderedlist"><ol class="orderedlist"><li class="listitem"><p>Pairing heaps seem to perform best for non-primitive
+ terms of amortized constants.</p><div class="orderedlist"><ol class="orderedlist" type="1"><li class="listitem"><p>Pairing heaps seem to perform best for non-primitive
types (e.g., <code class="classname">std::string</code>s), as shown by
Priority
Queue Text <code class="function">push</code> Timing Test and Priority
Queue Random Integer <code class="function">push</code> Timing Test and
Priority
Queue Random Integer <code class="function">push</code> and <code class="function">pop</code> Timing
- Test.</p></li></ol></div></div><div class="section" title="Graph Algorithms"><div class="titlepage"><div><div><h6 class="title"><a id="observations.priority_queue.graphs"/>
+ Test.</p></li></ol></div></div><div class="section" title="Graph Algorithms"><div class="titlepage"><div><div><h6 class="title"><a name="observations.priority_queue.graphs"></a>
Graph Algorithms
</h6></div></div></div><p>In some graph algorithms, a decrease-key operation is
required [clrs2001];
as well. It is difficult to find an a-priori characterization of
graphs in which the actual number of <code class="function">modify</code>
operations will dwarf the number of <code class="function">push</code> and
- <code class="function">pop</code> operations.</p></div></div></div></div></div><div class="navfooter"><hr/><table width="100%" summary="Navigation footer"><tr><td align="left"><a accesskey="p" href="policy_data_structures_design.html">Prev</a> </td><td align="center"><a accesskey="u" href="policy_data_structures.html">Up</a></td><td align="right"> <a accesskey="n" href="policy_data_structures_biblio.html">Next</a></td></tr><tr><td align="left" valign="top">Design </td><td align="center"><a accesskey="h" href="../index.html">Home</a></td><td align="right" valign="top"> Acknowledgments</td></tr></table></div></body></html>
+ <code class="function">pop</code> operations.</p></div></div></div></div></div><div class="navfooter"><hr><table width="100%" summary="Navigation footer"><tr><td width="40%" align="left"><a accesskey="p" href="policy_data_structures_design.html">Prev</a> </td><td width="20%" align="center"><a accesskey="u" href="policy_data_structures.html">Up</a></td><td width="40%" align="right"> <a accesskey="n" href="policy_data_structures_biblio.html">Next</a></td></tr><tr><td width="40%" align="left" valign="top">Design </td><td width="20%" align="center"><a accesskey="h" href="../index.html">Home</a></td><td width="40%" align="right" valign="top"> Acknowledgments</td></tr></table></div></body></html>