static size_t s_nInsertThreadCount; // count of insertion thread
static size_t s_nDeleteThreadCount; // count of deletion thread
static size_t s_nThreadPassCount; // pass count for each thread
+ 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_nMaxLoadFactor; // maximum load factor
static size_t s_nCuckooInitialSize; // initial size for CuckooMap
{
Map& rMap = m_Map;
- if ( id() & 1 ) {
- for ( size_t nPass = 0; nPass < s_nThreadPassCount; ++nPass ) {
- for ( auto it = s_arrKeys.cbegin(), itEnd = s_arrKeys.cend(); it != itEnd; ++it ) {
- if ( rMap.insert( *it, 0 ))
- ++m_nInsertSuccess;
- else
- ++m_nInsertFailed;
- }
- }
- }
- else {
- for ( size_t nPass = 0; nPass < s_nThreadPassCount; ++nPass ) {
- for ( auto it = s_arrKeys.crbegin(), itEnd = s_arrKeys.crend(); it != itEnd; ++it ) {
- if ( rMap.insert( *it, 1 ))
- ++m_nInsertSuccess;
- else
- ++m_nInsertFailed;
- }
- }
+ for (auto it = s_arrKeys.cbegin(), itEnd = s_arrKeys.cend();
+ it != itEnd; ++it) {
+ if (rMap.insert(*it, 0))
+ ++m_nInsertSuccess;
+ else
+ ++m_nInsertFailed;
}
}
};
{
Map& rMap = m_Map;
- if ( id() & 1 ) {
- for ( size_t nPass = 0; nPass < s_nThreadPassCount; ++nPass ) {
- for ( auto it = s_arrKeys.cbegin(), itEnd = s_arrKeys.cend(); it != itEnd; ++it ) {
- if ( rMap.erase( *it ))
- ++m_nDeleteSuccess;
- else
- ++m_nDeleteFailed;
- }
- }
- }
- else {
- for ( size_t nPass = 0; nPass < s_nThreadPassCount; ++nPass ) {
- for ( auto it = s_arrKeys.crbegin(), itEnd = s_arrKeys.crend(); it != itEnd; ++it ) {
- if ( rMap.erase( *it ))
- ++m_nDeleteSuccess;
- else
- ++m_nDeleteFailed;
- }
- }
+ for (auto it = s_arrKeys.cbegin(), itEnd = s_arrKeys.cend();
+ it != itEnd; ++it) {
+ if (rMap.erase(*it))
+ ++m_nDeleteSuccess;
+ else
+ ++m_nDeleteFailed;
}
}
};
typedef Deleter<Map> deleter;
cds_test::thread_pool& pool = get_pool();
- pool.add( new inserter( pool, testMap ), s_nInsertThreadCount );
- pool.add( new deleter( pool, testMap ), s_nDeleteThreadCount );
-
- propout() << std::make_pair( "insert_thread_count", s_nInsertThreadCount )
- << std::make_pair( "delete_thread_count", s_nDeleteThreadCount )
- << std::make_pair( "pass_count", s_nThreadPassCount )
- << std::make_pair( "map_size", s_nMapSize );
-
- std::chrono::milliseconds duration = pool.run();
-
- propout() << std::make_pair( "duration", duration );
-
- size_t nInsertSuccess = 0;
- size_t nInsertFailed = 0;
- size_t nDeleteSuccess = 0;
- size_t nDeleteFailed = 0;
-
- for ( size_t i = 0; i < pool.size(); ++i ) {
- cds_test::thread& thr = pool.get( i );
- switch ( thr.type()) {
- case insert_thread:
- {
- inserter& t = static_cast<inserter&>(thr);
- nInsertSuccess += t.m_nInsertSuccess;
- nInsertFailed += t.m_nInsertFailed;
- }
- break;
- case delete_thread:
- {
- deleter& t = static_cast<deleter&>(thr);
- nDeleteSuccess += t.m_nDeleteSuccess;
- nDeleteFailed += t.m_nDeleteFailed;
- }
- break;
- default:
- assert( false );
- }
+ std::unique_ptr<inserter> inserter_thrd(
+ new inserter(pool, testMap));
+ std::unique_ptr<deleter> deleter_thrd(
+ new deleter(pool, testMap));
+ for (size_t nPass = 0; nPass < s_nThreadPassCount; ++nPass) {
+ inserter_thrd->test();
+ deleter_thrd->test();
}
- 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( "finish_map_size", testMap.size());
-
- check_before_cleanup( testMap );
-
- //testMap.clear();
+ // testMap.clear();
for ( auto const& str: s_arrKeys )
testMap.erase( str );
EXPECT_TRUE( testMap.empty());
EXPECT_EQ( testMap.size(), 0u );
-
- 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_InsDel_string::s_nThreadPassCount =
+ Map_InsDel_string::s_nBronsonAVLTreeMapPassCount;
+ run_test<Map>();
+ }
+
+ template <class Map>
+ void run_ellen_bin_tree() {
+ Map_InsDel_string::s_nThreadPassCount =
+ Map_InsDel_string::s_nEllenBinTreeMapPassCount;
+ run_test<Map>();
+ }
+
+ template <class Map>
+ void run_feldman() {
+ Map_InsDel_string::s_nThreadPassCount =
+ Map_InsDel_string::s_nFeldmanPassCount;
+ run_test<Map>();
+ }
+
+ template <class Map>
+ void run_michael() {
+ Map_InsDel_string::s_nThreadPassCount =
+ Map_InsDel_string::s_nMichaelMapPassCount;
+ run_test<Map>();
+ }
+
+ template <class Map>
+ void run_skip_list() {
+ Map_InsDel_string::s_nThreadPassCount =
+ Map_InsDel_string::s_nSkipListMapPassCount;
+ run_test<Map>();
}
};