Uses different pass count for different parallel queue test cases
[libcds.git] / test / stress / map / insdelfind / map_insdelfind.cpp
1 /*
2     This file is a part of libcds - Concurrent Data Structures library
3
4     (C) Copyright Maxim Khizhinsky (libcds.dev@gmail.com) 2006-2017
5
6     Source code repo: http://github.com/khizmax/libcds/
7     Download: http://sourceforge.net/projects/libcds/files/
8
9     Redistribution and use in source and binary forms, with or without
10     modification, are permitted provided that the following conditions are met:
11
12     * Redistributions of source code must retain the above copyright notice, this
13       list of conditions and the following disclaimer.
14
15     * Redistributions in binary form must reproduce the above copyright notice,
16       this list of conditions and the following disclaimer in the documentation
17       and/or other materials provided with the distribution.
18
19     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20     AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21     IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22     DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23     FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24     DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25     SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27     OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28     OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31 #include "map_insdelfind.h"
32
33 namespace map {
34
35     size_t Map_InsDelFind::s_nMapSize = 500000;
36     size_t Map_InsDelFind::s_nThreadCount = 8;
37     size_t Map_InsDelFind::s_nPassCount = 100000;
38     size_t Map_InsDelFind::s_nBronsonAVLTreeMapPassCount = 100;
39
40     size_t Map_InsDelFind::s_nHpFeldmanPassCount = 100;
41     size_t Map_InsDelFind::s_nHpEllenBinTreeMapPassCount = 100;
42     size_t Map_InsDelFind::s_nHpMichaelMapPassCount = 100;
43     size_t Map_InsDelFind::s_nHpMichaelIterableMapPassCount = 100;
44     size_t Map_InsDelFind::s_nHpSkipListMapPassCount = 100;
45     size_t Map_InsDelFind::s_nHpSplitListMapPassCount = 100;
46     size_t Map_InsDelFind::s_nHpSplitListIterableMapPassCount = 100;
47
48     size_t Map_InsDelFind::s_nRcuFeldmanPassCount = 100;
49     size_t Map_InsDelFind::s_nRcuEllenBinTreeMapPassCount = 100;
50     size_t Map_InsDelFind::s_nRcuMichaelMapPassCount = 100;
51     size_t Map_InsDelFind::s_nRcuSkipListMapPassCount = 100;
52     size_t Map_InsDelFind::s_nRcuSplitListMapPassCount = 100;
53
54     size_t Map_InsDelFind::s_nMaxLoadFactor = 8;
55     unsigned int Map_InsDelFind::s_nInsertPercentage = 5;
56     unsigned int Map_InsDelFind::s_nDeletePercentage = 5;
57     unsigned int Map_InsDelFind::s_nDuration = 30;
58
59
60     size_t Map_InsDelFind::s_nCuckooInitialSize = 1024;// initial size for CuckooSet
61     size_t Map_InsDelFind::s_nCuckooProbesetSize = 16; // CuckooSet probeset size (only for list-based probeset)
62     size_t Map_InsDelFind::s_nCuckooProbesetThreshold = 0; // CUckooSet probeset threshold (0 - use default)
63
64     size_t Map_InsDelFind::s_nFeldmanMap_HeadBits = 10;
65     size_t Map_InsDelFind::s_nFeldmanMap_ArrayBits = 4;
66
67     size_t Map_InsDelFind::s_nLoadFactor = 1;
68     Map_InsDelFind::actions Map_InsDelFind::s_arrShuffle[Map_InsDelFind::c_nShuffleSize];
69
70     void Map_InsDelFind::SetUpTestCase()
71     {
72         cds_test::config const& cfg = get_config( "map_insdelfind" );
73
74         s_nMapSize = cfg.get_size_t( "InitialMapSize", s_nMapSize );
75         if ( s_nMapSize < 1000 )
76             s_nMapSize = 1000;
77
78         s_nThreadCount = cfg.get_size_t( "ThreadCount", s_nThreadCount );
79         if ( s_nThreadCount == 0 )
80             s_nThreadCount = std::min( 16u, std::thread::hardware_concurrency() * 2 );
81
82         s_nPassCount = cfg.get_size_t( "PassCount", s_nPassCount );
83         if ( s_nPassCount == 0 )
84             s_nPassCount = 1000;
85
86                                 s_nHpFeldmanPassCount =
87             cfg.get_size_t("HpFeldmanPassCount", s_nHpFeldmanPassCount);
88         if (s_nHpFeldmanPassCount == 0)
89           s_nHpFeldmanPassCount = 500;
90
91         s_nRcuFeldmanPassCount =
92             cfg.get_size_t("RcuFeldmanPassCount", s_nRcuFeldmanPassCount);
93         if (s_nRcuFeldmanPassCount == 0)
94           s_nRcuFeldmanPassCount = 500;
95
96         s_nHpEllenBinTreeMapPassCount = cfg.get_size_t(
97             "HpEllenBinTreeMapPassCount", s_nHpEllenBinTreeMapPassCount);
98         if (s_nHpEllenBinTreeMapPassCount == 0)
99           s_nHpEllenBinTreeMapPassCount = 500;
100
101                                 s_nRcuEllenBinTreeMapPassCount = cfg.get_size_t(
102             "RcuEllenBinTreeMapPassCount", s_nRcuEllenBinTreeMapPassCount);
103         if (s_nRcuEllenBinTreeMapPassCount == 0)
104           s_nRcuEllenBinTreeMapPassCount = 500;
105
106         s_nHpMichaelMapPassCount =
107             cfg.get_size_t("HpMichaelMapPassCount", s_nHpMichaelMapPassCount);
108         if (s_nHpMichaelMapPassCount == 0)
109           s_nHpMichaelMapPassCount = 500;
110
111         s_nHpMichaelIterableMapPassCount = cfg.get_size_t(
112             "HpMichaelIterableMapPassCount", s_nHpMichaelIterableMapPassCount);
113         if (s_nHpMichaelIterableMapPassCount == 0)
114           s_nHpMichaelIterableMapPassCount = 500;
115
116         s_nRcuMichaelMapPassCount =
117             cfg.get_size_t("RcuMichaelMapPassCount", s_nRcuMichaelMapPassCount);
118         if (s_nRcuMichaelMapPassCount == 0)
119           s_nRcuMichaelMapPassCount = 500;
120
121         s_nHpSkipListMapPassCount =
122             cfg.get_size_t("HpSkipListMapPassCount", s_nHpSkipListMapPassCount);
123         if (s_nHpSkipListMapPassCount == 0)
124           s_nHpSkipListMapPassCount = 500;
125
126                                 s_nRcuSkipListMapPassCount =
127             cfg.get_size_t("RcuSkipListMapPassCount", s_nRcuSkipListMapPassCount);
128         if (s_nRcuSkipListMapPassCount == 0)
129           s_nRcuSkipListMapPassCount = 500;
130
131         s_nHpSplitListMapPassCount =
132             cfg.get_size_t("HpSplitListMapPassCount", s_nHpSplitListMapPassCount);
133         if (s_nHpSplitListMapPassCount == 0)
134           s_nHpSplitListMapPassCount = 500;
135
136         s_nHpSplitListIterableMapPassCount =
137             cfg.get_size_t("HpSplitListIterableMapPassCount",
138                            s_nHpSplitListIterableMapPassCount);
139         if (s_nHpSplitListIterableMapPassCount == 0)
140           s_nHpSplitListIterableMapPassCount = 500;
141
142         s_nRcuSplitListMapPassCount =
143             cfg.get_size_t("RcuSplitListMapPassCount", s_nRcuSplitListMapPassCount);
144         if (s_nRcuSplitListMapPassCount == 0)
145           s_nRcuSplitListMapPassCount = 500;
146
147         s_nMaxLoadFactor = cfg.get_size_t( "MaxLoadFactor", s_nMaxLoadFactor );
148         if ( s_nMaxLoadFactor == 0 )
149             s_nMaxLoadFactor = 1;
150
151         s_nInsertPercentage = cfg.get_uint( "InsertPercentage", s_nInsertPercentage );
152         if ( s_nInsertPercentage >= 100 )
153             s_nInsertPercentage = 99;
154
155         s_nDeletePercentage = cfg.get_uint( "DeletePercentage", s_nDeletePercentage );
156         if ( s_nDeletePercentage >= 100 )
157             s_nDeletePercentage = 99;
158
159         if ( s_nInsertPercentage + s_nDeletePercentage > 100 ) {
160             unsigned int total = s_nInsertPercentage + s_nDeletePercentage;
161             s_nInsertPercentage = s_nInsertPercentage * 100 / total;
162             s_nDeletePercentage = s_nDeletePercentage * 100 / total;
163         }
164
165         s_nDuration = cfg.get_uint( "Duration", s_nDuration );
166         if ( s_nDuration < 5 )
167             s_nDuration = 5;
168
169         s_nCuckooInitialSize = cfg.get_size_t( "CuckooInitialSize", s_nCuckooInitialSize );
170         if ( s_nCuckooInitialSize < 256 )
171             s_nCuckooInitialSize = 256;
172
173         s_nCuckooProbesetSize = cfg.get_size_t( "CuckooProbesetSize", s_nCuckooProbesetSize );
174         if ( s_nCuckooProbesetSize < 8 )
175             s_nCuckooProbesetSize = 8;
176
177         s_nCuckooProbesetThreshold = cfg.get_size_t( "CuckooProbesetThreshold", s_nCuckooProbesetThreshold );
178
179         s_nFeldmanMap_HeadBits = cfg.get_size_t( "FeldmanMapHeadBits", s_nFeldmanMap_HeadBits );
180         if ( s_nFeldmanMap_HeadBits == 0 )
181             s_nFeldmanMap_HeadBits = 2;
182
183         s_nFeldmanMap_ArrayBits = cfg.get_size_t( "FeldmanMapArrayBits", s_nFeldmanMap_ArrayBits );
184         if ( s_nFeldmanMap_ArrayBits == 0 )
185             s_nFeldmanMap_ArrayBits = 2;
186
187         actions * pFirst = s_arrShuffle;
188         actions * pLast = s_arrShuffle + s_nInsertPercentage;
189         std::fill( pFirst, pLast, do_insert );
190         pFirst = pLast;
191         pLast += s_nDeletePercentage;
192         std::fill( pFirst, pLast, do_delete );
193         pFirst = pLast;
194         pLast = s_arrShuffle + sizeof( s_arrShuffle ) / sizeof( s_arrShuffle[0] );
195         if ( pFirst < pLast )
196             std::fill( pFirst, pLast, do_find );
197         shuffle( s_arrShuffle, pLast );
198     }
199
200     std::vector<size_t> Map_InsDelFind_LF::get_load_factors()
201     {
202         cds_test::config const& cfg = get_config( "map_insdelfind" );
203
204         s_nMaxLoadFactor = cfg.get_size_t( "MaxLoadFactor", s_nMaxLoadFactor );
205         if ( s_nMaxLoadFactor == 0 )
206             s_nMaxLoadFactor = 1;
207
208         // Only test with max load factor.
209       std::vector<size_t> lf = {s_nMaxLoadFactor};
210 //      for (size_t n = 1; n <= s_nMaxLoadFactor; n *= 2)
211 //        lf.push_back(n);
212
213         return lf;
214     }
215
216 #ifdef CDSTEST_GTEST_INSTANTIATE_TEST_CASE_P_HAS_4TH_ARG
217     static std::string get_test_parameter_name( testing::TestParamInfo<size_t> const& p )
218     {
219         return std::to_string( p.param );
220     }
221     INSTANTIATE_TEST_CASE_P( a, Map_InsDelFind_LF, ::testing::ValuesIn( Map_InsDelFind_LF::get_load_factors()), get_test_parameter_name );
222 #else
223     INSTANTIATE_TEST_CASE_P( a, Map_InsDelFind_LF, ::testing::ValuesIn( Map_InsDelFind_LF::get_load_factors()));
224 #endif
225
226 } // namespace map