size_t Map_InsDelFind::s_nMapSize = 500000;
size_t Map_InsDelFind::s_nThreadCount = 8;
+
+ size_t Map_InsDelFind::s_nPassCount = 100;
+ size_t Map_InsDelFind::s_nFeldmanPassCount = 100;
+ size_t Map_InsDelFind::s_nBronsonAVLTreeMapPassCount = 100;
+ size_t Map_InsDelFind::s_nEllenBinTreeMapPassCount = 100;
+ size_t Map_InsDelFind::s_nMichaelMapPassCount = 100;
+ size_t Map_InsDelFind::s_nSkipListMapPassCount = 100;
+ size_t Map_InsDelFind::s_nSplitListMapPassCount = 100;
+
size_t Map_InsDelFind::s_nMaxLoadFactor = 8;
unsigned int Map_InsDelFind::s_nInsertPercentage = 5;
unsigned int Map_InsDelFind::s_nDeletePercentage = 5;
void Map_InsDelFind::SetUpTestCase()
{
- cds_test::config const& cfg = get_config( "map_insdelfind" );
+ cds_test::config const& cfg = get_config( "sequential_real_map_insdelfind" );
s_nMapSize = cfg.get_size_t( "InitialMapSize", s_nMapSize );
if ( s_nMapSize < 1000 )
if ( s_nThreadCount == 0 )
s_nThreadCount = std::min( 16u, std::thread::hardware_concurrency() * 2 );
+ s_nPassCount =
+ cfg.get_size_t("PassCount", s_nPassCount);
+ if (s_nPassCount == 0)
+ s_nPassCount = 500;
+
+ s_nFeldmanPassCount =
+ cfg.get_size_t("FeldmanPassCount", s_nFeldmanPassCount);
+ if (s_nFeldmanPassCount == 0)
+ s_nFeldmanPassCount = 500;
+
+ s_nBronsonAVLTreeMapPassCount = cfg.get_size_t(
+ "BronsonAVLTreeMapPassCount", s_nBronsonAVLTreeMapPassCount);
+ if (s_nBronsonAVLTreeMapPassCount == 0)
+ s_nBronsonAVLTreeMapPassCount = 500;
+
+ s_nEllenBinTreeMapPassCount = cfg.get_size_t(
+ "EllenBinTreeMapPassCount", s_nEllenBinTreeMapPassCount);
+ if (s_nEllenBinTreeMapPassCount == 0)
+ s_nEllenBinTreeMapPassCount = 500;
+
+ s_nMichaelMapPassCount =
+ cfg.get_size_t("MichaelMapPassCount", s_nMichaelMapPassCount);
+ if (s_nMichaelMapPassCount == 0)
+ s_nMichaelMapPassCount = 500;
+
+ s_nSkipListMapPassCount =
+ cfg.get_size_t("SkipListMapPassCount", s_nSkipListMapPassCount);
+ if (s_nSkipListMapPassCount == 0)
+ s_nSkipListMapPassCount = 500;
+
+ s_nSplitListMapPassCount =
+ cfg.get_size_t("SplitListMapPassCount", s_nSplitListMapPassCount);
+ if (s_nSplitListMapPassCount == 0)
+ s_nSplitListMapPassCount = 500;
+
s_nMaxLoadFactor = cfg.get_size_t( "MaxLoadFactor", s_nMaxLoadFactor );
if ( s_nMaxLoadFactor == 0 )
s_nMaxLoadFactor = 1;
{
public:
static size_t s_nMapSize; // initial map size
+
+ static size_t s_nPassCount;
+ static size_t s_nBronsonAVLTreeMapPassCount;
+ static size_t s_nEllenBinTreeMapPassCount;
+ static size_t s_nFeldmanPassCount;
+ static size_t s_nMichaelMapPassCount;
+ static size_t s_nSkipListMapPassCount;
+ static size_t s_nSplitListMapPassCount;
+
static size_t s_nThreadCount; // thread count
static size_t s_nMaxLoadFactor; // maximum load factor
static unsigned int s_nInsertPercentage;
virtual void test()
{
Map& rMap = m_Map;
+ Map_InsDelFind& fixture = pool().template fixture<Map_InsDelFind>();
+ size_t pass_count = fixture.s_nPassCount;
unsigned int i = 0;
size_t const nNormalize = size_t(-1) / ( s_nMapSize * 2 );
size_t nRand = 0;
- while ( !time_elapsed()) {
+ while ( pass_count-- ) {
nRand = cds::bitop::RandXorShift( nRand );
size_t n = nRand / nNormalize;
switch ( s_arrShuffle[i] ) {
}
cds_test::thread_pool& pool = get_pool();
- pool.add( new worker( pool, testMap ), s_nThreadCount );
-
- propout() << std::make_pair( "thread_count", s_nThreadCount )
- << std::make_pair( "insert_percentage", s_nInsertPercentage )
- << std::make_pair( "delete_percentage", s_nDeletePercentage )
- << std::make_pair( "map_size", s_nMapSize );
-
- std::chrono::milliseconds duration = pool.run( std::chrono::seconds( s_nDuration ));
-
- propout() << std::make_pair( "duration", duration );
-
- size_t nInsertSuccess = 0;
- size_t nInsertFailed = 0;
- size_t nDeleteSuccess = 0;
- size_t nDeleteFailed = 0;
- size_t nFindSuccess = 0;
- size_t nFindFailed = 0;
- for ( size_t i = 0; i < pool.size(); ++i ) {
- worker& thr = static_cast<worker&>( pool.get( i ));
-
- nInsertSuccess += thr.m_nInsertSuccess;
- nInsertFailed += thr.m_nInsertFailed;
- nDeleteSuccess += thr.m_nDeleteSuccess;
- nDeleteFailed += thr.m_nDeleteFailed;
- nFindSuccess += thr.m_nFindSuccess;
- nFindFailed += thr.m_nFindFailed;
- }
-
- propout()
- << std::make_pair( "insert_success", nInsertSuccess )
- << std::make_pair( "insert_failed", nInsertFailed )
- << std::make_pair( "delete_success", nDeleteSuccess )
- << std::make_pair( "delete_failed", nDeleteFailed )
- << std::make_pair( "find_success", nFindSuccess )
- << std::make_pair( "find_failed", nFindFailed )
- << std::make_pair( "finish_map_size", testMap.size());
-
- {
- ASSERT_TRUE( std::chrono::duration_cast<std::chrono::seconds>(duration).count() > 0 );
- size_t nTotalOps = nInsertSuccess + nInsertFailed + nDeleteSuccess + nDeleteFailed + nFindSuccess + nFindFailed;
- propout() << std::make_pair( "avg_speed", nTotalOps / std::chrono::duration_cast<std::chrono::seconds>( duration ).count());
- }
-
- check_before_cleanup( testMap );
+ std::unique_ptr<worker> worker_thrd(new worker(pool, testMap));
+ worker_thrd->test();
testMap.clear();
EXPECT_TRUE( testMap.empty());
-
- additional_check( testMap );
- print_stat( propout(), testMap );
additional_cleanup( testMap );
}
Map testMap( *this );
do_test( testMap );
}
+
+ template <class Map>
+ void run_bronson_avl_tree() {
+ Map_InsDelFind::s_nPassCount =
+ Map_InsDelFind::s_nBronsonAVLTreeMapPassCount;
+ run_test<Map>();
+ }
+
+ template <class Map>
+ void run_ellen_bin_tree() {
+ Map_InsDelFind::s_nPassCount =
+ Map_InsDelFind::s_nEllenBinTreeMapPassCount;
+ run_test<Map>();
+ }
+
+ template <class Map>
+ void run_skip_list() {
+ Map_InsDelFind::s_nPassCount =
+ Map_InsDelFind::s_nSkipListMapPassCount;
+ run_test<Map>();
+ }
+
+ template <class Map>
+ void run_feldman() {
+ Map_InsDelFind::s_nPassCount =
+ Map_InsDelFind::s_nFeldmanPassCount;
+ run_test<Map>();
+ }
};
class Map_InsDelFind_LF: public Map_InsDelFind
Map_InsDelFind::run_test<Map>();
}
+ template <class Map>
+ void run_michael() {
+ Map_InsDelFind::s_nPassCount =
+ Map_InsDelFind::s_nMichaelMapPassCount;
+ Map_InsDelFind_LF::run_test<Map>();
+ }
+
+ template <class Map>
+ void run_split_list() {
+ Map_InsDelFind::s_nPassCount =
+ Map_InsDelFind::s_nSplitListMapPassCount;
+ Map_InsDelFind_LF::run_test<Map>();
+ }
+
static std::vector<size_t> get_load_factors();
};