3 #include "map2/map_type.h"
4 #include "cppunit/thread.h"
6 #include <cds/os/topology.h>
11 #define TEST_CASE(TAG, X) void X();
13 class Map_InsFind_int: public CppUnitMini::TestCase
16 size_t c_nThreadCount = 8; // thread count
17 size_t c_nMapSize = 5000; // map size (count of searching item)
18 size_t c_nMaxLoadFactor = 8; // maximum load factor
19 bool c_bPrintGCState = true;
21 size_t c_nCuckooInitialSize = 1024;// initial size for CuckooMap
22 size_t c_nCuckooProbesetSize = 16; // CuckooMap probeset size (only for list-based probeset)
23 size_t c_nCuckooProbesetThreshold = 0; // CUckooMap probeset threshold (o - use default)
25 size_t c_nMultiLevelMap_HeadBits = 10;
26 size_t c_nMultiLevelMap_ArrayBits = 4;
28 size_t c_nLoadFactor = 2; // current load factor
31 typedef CppUnitMini::TestCase Base;
32 typedef size_t key_type;
33 typedef size_t value_type;
35 template <typename Iterator, typename Map>
36 static bool check_result( Iterator const& it, Map const& map )
38 return it != map.end();
40 template <typename Map>
41 static bool check_result( bool b, Map const& )
47 class Inserter: public CppUnitMini::TestThread
50 std::vector<size_t> m_arrVal;
52 virtual Inserter * clone()
54 return new Inserter( *this );
59 size_t const nThreadCount = getTest().c_nThreadCount;
60 size_t const nSize = getTest().c_nMapSize / nThreadCount + 1;
61 m_arrVal.resize( nSize );
62 size_t nItem = m_nThreadNo;
63 for ( size_t i = 0; i < nSize; nItem += nThreadCount, ++i )
65 shuffle( m_arrVal.begin(), m_arrVal.end() );
68 size_t m_nInsertSuccess;
69 size_t m_nInsertFailed;
70 size_t m_nFindSuccess;
74 Inserter( CppUnitMini::ThreadPool& pool, Map& rMap )
75 : CppUnitMini::TestThread( pool )
78 Inserter( Inserter& src )
79 : CppUnitMini::TestThread( src )
83 Map_InsFind_int& getTest()
85 return reinterpret_cast<Map_InsFind_int&>( m_Pool.m_Test );
90 cds::threading::Manager::attachThread();
93 virtual void fini() { cds::threading::Manager::detachThread() ; }
104 size_t const nArrSize = m_arrVal.size();
105 for ( size_t i = 0; i < nArrSize; ++i ) {
106 size_t const nItem = m_arrVal[i];
107 if ( check_result( rMap.insert( nItem, nItem * 8 ), rMap ))
112 for ( size_t k = 0; k <= i; ++k ) {
113 if ( check_result( rMap.contains( m_arrVal[k] ), rMap ))
125 void do_test( Map& testMap )
127 typedef Inserter<Map> InserterThread;
128 cds::OS::Timer timer;
130 CppUnitMini::ThreadPool pool( *this );
131 pool.add( new InserterThread( pool, testMap ), c_nThreadCount );
133 CPPUNIT_MSG( " Duration=" << pool.avgDuration() );
135 size_t nInsertSuccess = 0;
136 size_t nInsertFailed = 0;
137 size_t nFindSuccess = 0;
138 size_t nFindFailed = 0;
139 for ( CppUnitMini::ThreadPool::iterator it = pool.begin(); it != pool.end(); ++it ) {
140 InserterThread * pThread = static_cast<InserterThread *>( *it );
142 nInsertSuccess += pThread->m_nInsertSuccess;
143 nInsertFailed += pThread->m_nInsertFailed;
144 nFindSuccess += pThread->m_nFindSuccess;
145 nFindFailed += pThread->m_nFindFail;
148 CPPUNIT_MSG( " Totals: Ins succ=" << nInsertSuccess << " fail=" << nInsertFailed << "\n"
149 << " Find succ=" << nFindSuccess << " fail=" << nFindFailed
152 CPPUNIT_CHECK( nInsertFailed == 0 );
153 CPPUNIT_CHECK( nFindFailed == 0 );
155 check_before_cleanup( testMap );
158 additional_check( testMap );
159 print_stat( testMap );
160 additional_cleanup( testMap );
166 static_assert( (!std::is_same< typename Map::item_counter, cds::atomicity::empty_item_counter >::value),
167 "Empty item counter is not suitable for this test");
169 CPPUNIT_MSG( "Thread count: " << c_nThreadCount
170 << " map size=" << c_nMapSize
173 if ( Map::c_bLoadFactorDepended ) {
174 for ( c_nLoadFactor = 1; c_nLoadFactor <= c_nMaxLoadFactor; c_nLoadFactor *= 2 ) {
175 CPPUNIT_MSG( "Load factor=" << c_nLoadFactor );
176 Map testMap( *this );
178 if ( c_bPrintGCState )
183 Map testMap( *this );
185 if ( c_bPrintGCState )
190 void setUpParams( const CppUnitMini::TestCfg& cfg );
192 # include "map2/map_defs.h"
193 CDSUNIT_DECLARE_MichaelMap
194 CDSUNIT_DECLARE_MichaelMap_nogc
195 CDSUNIT_DECLARE_SplitList
196 CDSUNIT_DECLARE_SplitList_nogc
197 CDSUNIT_DECLARE_SkipListMap
198 CDSUNIT_DECLARE_SkipListMap_nogc
199 CDSUNIT_DECLARE_EllenBinTreeMap
200 CDSUNIT_DECLARE_BronsonAVLTreeMap
201 CDSUNIT_DECLARE_MultiLevelHashMap
202 CDSUNIT_DECLARE_StripedMap
203 CDSUNIT_DECLARE_RefinableMap
204 CDSUNIT_DECLARE_CuckooMap
205 CDSUNIT_DECLARE_StdMap
206 CDSUNIT_DECLARE_StdMap_NoLock
208 CPPUNIT_TEST_SUITE(Map_InsFind_int)
209 CDSUNIT_TEST_MichaelMap
210 CDSUNIT_TEST_MichaelMap_nogc
211 CDSUNIT_TEST_SplitList
212 CDSUNIT_TEST_SplitList_nogc
213 CDSUNIT_TEST_SkipListMap
214 CDSUNIT_TEST_SkipListMap_nogc
215 CDSUNIT_TEST_EllenBinTreeMap
216 CDSUNIT_TEST_BronsonAVLTreeMap
217 CDSUNIT_TEST_MultiLevelHashMap
218 CDSUNIT_TEST_CuckooMap
219 CDSUNIT_TEST_StripedMap
220 CDSUNIT_TEST_RefinableMap
222 CDSUNIT_TEST_StdMap_NoLock
223 CPPUNIT_TEST_SUITE_END();