5596ae41adf532b10c795b0761fd11feb2eee0c6
[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_nHpSkipListMapPassCount = 100;
44     size_t Map_InsDelFind::s_nHpSplitListMapPassCount = 100;
45
46     size_t Map_InsDelFind::s_nRcuFeldmanPassCount = 100;
47     size_t Map_InsDelFind::s_nRcuEllenBinTreeMapPassCount = 100;
48     size_t Map_InsDelFind::s_nRcuMichaelMapPassCount = 100;
49     size_t Map_InsDelFind::s_nRcuSkipListMapPassCount = 100;
50     size_t Map_InsDelFind::s_nRcuSplitListMapPassCount = 100;
51
52     size_t Map_InsDelFind::s_nMaxLoadFactor = 8;
53     unsigned int Map_InsDelFind::s_nInsertPercentage = 5;
54     unsigned int Map_InsDelFind::s_nDeletePercentage = 5;
55     unsigned int Map_InsDelFind::s_nDuration = 30;
56
57
58     size_t Map_InsDelFind::s_nCuckooInitialSize = 1024;// initial size for CuckooSet
59     size_t Map_InsDelFind::s_nCuckooProbesetSize = 16; // CuckooSet probeset size (only for list-based probeset)
60     size_t Map_InsDelFind::s_nCuckooProbesetThreshold = 0; // CUckooSet probeset threshold (0 - use default)
61
62     size_t Map_InsDelFind::s_nFeldmanMap_HeadBits = 10;
63     size_t Map_InsDelFind::s_nFeldmanMap_ArrayBits = 4;
64
65     size_t Map_InsDelFind::s_nLoadFactor = 1;
66     Map_InsDelFind::actions Map_InsDelFind::s_arrShuffle[Map_InsDelFind::c_nShuffleSize];
67
68     void Map_InsDelFind::SetUpTestCase()
69     {
70         cds_test::config const& cfg = get_config( "map_insdelfind" );
71
72         s_nMapSize = cfg.get_size_t( "InitialMapSize", s_nMapSize );
73         if ( s_nMapSize < 1000 )
74             s_nMapSize = 1000;
75
76         s_nThreadCount = cfg.get_size_t( "ThreadCount", s_nThreadCount );
77         if ( s_nThreadCount == 0 )
78             s_nThreadCount = std::min( 16u, std::thread::hardware_concurrency() * 2 );
79
80         s_nPassCount = cfg.get_size_t( "PassCount", s_nPassCount );
81         if ( s_nPassCount == 0 )
82             s_nPassCount = 1000;
83
84                                 s_nHpFeldmanPassCount =
85             cfg.get_size_t("HpFeldmanPassCount", s_nHpFeldmanPassCount);
86         if (s_nHpFeldmanPassCount == 0)
87           s_nHpFeldmanPassCount = 500;
88
89         s_nRcuFeldmanPassCount =
90             cfg.get_size_t("RcuFeldmanPassCount", s_nRcuFeldmanPassCount);
91         if (s_nRcuFeldmanPassCount == 0)
92           s_nRcuFeldmanPassCount = 500;
93
94         s_nHpEllenBinTreeMapPassCount = cfg.get_size_t(
95             "HpEllenBinTreeMapPassCount", s_nHpEllenBinTreeMapPassCount);
96         if (s_nHpEllenBinTreeMapPassCount == 0)
97           s_nHpEllenBinTreeMapPassCount = 500;
98
99                                 s_nRcuEllenBinTreeMapPassCount = cfg.get_size_t(
100             "RcuEllenBinTreeMapPassCount", s_nRcuEllenBinTreeMapPassCount);
101         if (s_nRcuEllenBinTreeMapPassCount == 0)
102           s_nRcuEllenBinTreeMapPassCount = 500;
103
104         s_nHpMichaelMapPassCount =
105             cfg.get_size_t("HpMichaelMapPassCount", s_nHpMichaelMapPassCount);
106         if (s_nHpMichaelMapPassCount == 0)
107           s_nHpMichaelMapPassCount = 500;
108
109         s_nRcuMichaelMapPassCount =
110             cfg.get_size_t("RcuMichaelMapPassCount", s_nRcuMichaelMapPassCount);
111         if (s_nRcuMichaelMapPassCount == 0)
112           s_nRcuMichaelMapPassCount = 500;
113
114         s_nHpSkipListMapPassCount =
115             cfg.get_size_t("HpSkipListMapPassCount", s_nHpSkipListMapPassCount);
116         if (s_nHpSkipListMapPassCount == 0)
117           s_nHpSkipListMapPassCount = 500;
118
119                                 s_nRcuSkipListMapPassCount =
120             cfg.get_size_t("RcuSkipListMapPassCount", s_nRcuSkipListMapPassCount);
121         if (s_nRcuSkipListMapPassCount == 0)
122           s_nRcuSkipListMapPassCount = 500;
123
124         s_nHpSplitListMapPassCount =
125             cfg.get_size_t("HpSplitListMapPassCount", s_nHpSplitListMapPassCount);
126         if (s_nHpSplitListMapPassCount == 0)
127           s_nHpSplitListMapPassCount = 500;
128
129         s_nRcuSplitListMapPassCount =
130             cfg.get_size_t("RcuSplitListMapPassCount", s_nRcuSplitListMapPassCount);
131         if (s_nRcuSplitListMapPassCount == 0)
132           s_nRcuSplitListMapPassCount = 500;
133
134         s_nMaxLoadFactor = cfg.get_size_t( "MaxLoadFactor", s_nMaxLoadFactor );
135         if ( s_nMaxLoadFactor == 0 )
136             s_nMaxLoadFactor = 1;
137
138         s_nInsertPercentage = cfg.get_uint( "InsertPercentage", s_nInsertPercentage );
139         if ( s_nInsertPercentage >= 100 )
140             s_nInsertPercentage = 99;
141
142         s_nDeletePercentage = cfg.get_uint( "DeletePercentage", s_nDeletePercentage );
143         if ( s_nDeletePercentage >= 100 )
144             s_nDeletePercentage = 99;
145
146         if ( s_nInsertPercentage + s_nDeletePercentage > 100 ) {
147             unsigned int total = s_nInsertPercentage + s_nDeletePercentage;
148             s_nInsertPercentage = s_nInsertPercentage * 100 / total;
149             s_nDeletePercentage = s_nDeletePercentage * 100 / total;
150         }
151
152         s_nDuration = cfg.get_uint( "Duration", s_nDuration );
153         if ( s_nDuration < 5 )
154             s_nDuration = 5;
155
156         s_nCuckooInitialSize = cfg.get_size_t( "CuckooInitialSize", s_nCuckooInitialSize );
157         if ( s_nCuckooInitialSize < 256 )
158             s_nCuckooInitialSize = 256;
159
160         s_nCuckooProbesetSize = cfg.get_size_t( "CuckooProbesetSize", s_nCuckooProbesetSize );
161         if ( s_nCuckooProbesetSize < 8 )
162             s_nCuckooProbesetSize = 8;
163
164         s_nCuckooProbesetThreshold = cfg.get_size_t( "CuckooProbesetThreshold", s_nCuckooProbesetThreshold );
165
166         s_nFeldmanMap_HeadBits = cfg.get_size_t( "FeldmanMapHeadBits", s_nFeldmanMap_HeadBits );
167         if ( s_nFeldmanMap_HeadBits == 0 )
168             s_nFeldmanMap_HeadBits = 2;
169
170         s_nFeldmanMap_ArrayBits = cfg.get_size_t( "FeldmanMapArrayBits", s_nFeldmanMap_ArrayBits );
171         if ( s_nFeldmanMap_ArrayBits == 0 )
172             s_nFeldmanMap_ArrayBits = 2;
173
174         actions * pFirst = s_arrShuffle;
175         actions * pLast = s_arrShuffle + s_nInsertPercentage;
176         std::fill( pFirst, pLast, do_insert );
177         pFirst = pLast;
178         pLast += s_nDeletePercentage;
179         std::fill( pFirst, pLast, do_delete );
180         pFirst = pLast;
181         pLast = s_arrShuffle + sizeof( s_arrShuffle ) / sizeof( s_arrShuffle[0] );
182         if ( pFirst < pLast )
183             std::fill( pFirst, pLast, do_find );
184         shuffle( s_arrShuffle, pLast );
185     }
186
187     std::vector<size_t> Map_InsDelFind_LF::get_load_factors()
188     {
189         cds_test::config const& cfg = get_config( "map_insdelfind" );
190
191         s_nMaxLoadFactor = cfg.get_size_t( "MaxLoadFactor", s_nMaxLoadFactor );
192         if ( s_nMaxLoadFactor == 0 )
193             s_nMaxLoadFactor = 1;
194
195         // Only test with max load factor.
196       std::vector<size_t> lf = {s_nMaxLoadFactor};
197 //      for (size_t n = 1; n <= s_nMaxLoadFactor; n *= 2)
198 //        lf.push_back(n);
199
200         return lf;
201     }
202
203 #ifdef CDSTEST_GTEST_INSTANTIATE_TEST_CASE_P_HAS_4TH_ARG
204     static std::string get_test_parameter_name( testing::TestParamInfo<size_t> const& p )
205     {
206         return std::to_string( p.param );
207     }
208     INSTANTIATE_TEST_CASE_P( a, Map_InsDelFind_LF, ::testing::ValuesIn( Map_InsDelFind_LF::get_load_factors()), get_test_parameter_name );
209 #else
210     INSTANTIATE_TEST_CASE_P( a, Map_InsDelFind_LF, ::testing::ValuesIn( Map_InsDelFind_LF::get_load_factors()));
211 #endif
212
213 } // namespace map