X-Git-Url: http://plrg.eecs.uci.edu/git/?p=junction.git;a=blobdiff_plain;f=test%2Fjunction_driver.cpp;h=3ac134b62f445725b2373eafe22b28cc73ab53dc;hp=0b2fcf9a3a2c812b4e6daf7abfe488ea16ed8e20;hb=ae91f5184f587d5afdf94d95b57d2a90a30ff5bf;hpb=8033f6ca38e5a66995bf90beb1cbaff810298db4 diff --git a/test/junction_driver.cpp b/test/junction_driver.cpp index 0b2fcf9..3ac134b 100644 --- a/test/junction_driver.cpp +++ b/test/junction_driver.cpp @@ -1,4 +1,7 @@ #include +#include +#include +#include #include #include #include @@ -8,20 +11,103 @@ namespace { const unsigned s_nInsertPercentage = 10; const char* kTestName = "InsDelFind"; +// Run GC after "kGCFrequency" operations. +const size_t kGCFrequency = 3000; +const size_t kLeapfrogGCFrequency = 1500; + +const size_t kCrudeMapSize = 10000; +const size_t kCrudePassCount = 400000; +const char* kCrudeBenchmarkName = "JunctionMapCrude"; + const size_t kGrampaMapSize = 20000; const size_t kGrampaPassCount = 30000; -const char* kGrampaBenchmarkName = "JunctionMapLinear"; +const char* kGrampaBenchmarkName = "JunctionMapGrampa"; + +const size_t kLinearMapSize = 20000; +const size_t kLinearPassCount = 70000; +const char* kLinearBenchmarkName = "JunctionMapLinear"; + +const size_t kLeapfrogMapSize = 20000; +const size_t kLeapfrogPassCount = 75000; +const char* kLeapfrogBenchmarkName = "JunctionMapLeapfrog"; } // namespace typedef junction::ConcurrentMap_Grampa GrampaMap; +typedef junction::ConcurrentMap_Linear LinearMap; +typedef junction::ConcurrentMap_Leapfrog LeapfrogMap; +typedef junction::ConcurrentMap_Crude CrudeMap; + +template +void run_crude_map(size_t map_size, size_t pass_count, const char* bench_name, + size_t gc_frequency) { + std::cout << "[ RUN ] " << kTestName << "." << bench_name << "\n"; + auto start_time = std::chrono::system_clock::now(); + + size_t nInsertedNum = 0; + size_t nFindSuccess = 0; + size_t nOperations = 0; + // Seems like the crude map won't resize, so better have a large enough + // capacity. + std::unique_ptr map(new Map(map_size * 32)); + auto qsbrContext = junction::DefaultQSBR.createContext(); + for (size_t count = 0; count < pass_count; count++) { + for (size_t i = 0; i < map_size; ++i) { + // The number to operate on the map. + size_t n = map_size + i; + // Insert + if (i % s_nInsertPercentage == 1) { + map->assign(i, n); + nInsertedNum++; +// std::cout << "Inserted" << i << "\n"; + } + // Find + { + if (map->get(i)) { + ++nFindSuccess; +// std::cout << "Found" << i << "\n"; + } + } + // Delete + if (i % s_nInsertPercentage == 1) { + if (map->get(i)) { + map->assign(n, 0); +// std::cout << "Erased" << i << "\n"; + } + } + if (++nOperations > gc_frequency) { + junction::DefaultQSBR.update(qsbrContext); + nOperations = 0; + } + } + } + junction::DefaultQSBR.update(qsbrContext); + junction::DefaultQSBR.destroyContext(qsbrContext ); + auto finish_time = std::chrono::system_clock::now(); + auto dur = finish_time - start_time; + auto milisecs = std::chrono::duration_cast(dur); + + if (nFindSuccess != nInsertedNum) { + std::cout << "nFindSuccess=" << nFindSuccess << ", nInsertedNum=" + << nInsertedNum << "\n"; + std::cout << "[ FAILED ] " << kTestName << "." << bench_name + << "(" << milisecs.count() << " ms)\n"; + assert(false && "ConcurrentMap ERROR"); + } else { + std::cout << "[ OK ] " << kTestName << "." << bench_name + << "(" << milisecs.count() << " ms)\n"; + } +} template -void run_test(size_t map_size, size_t pass_count, const char* bench_name) { +void run_test(size_t map_size, size_t pass_count, const char* bench_name, + size_t gc_frequency) { + std::cout << "[ RUN ] " << kTestName << "." << bench_name << "\n"; auto start_time = std::chrono::system_clock::now(); size_t nInsertedNum = 0; size_t nFindSuccess = 0; + size_t nOperations = 0; std::unique_ptr map(new Map()); auto qsbrContext = junction::DefaultQSBR.createContext(); for (size_t count = 0; count < pass_count; count++) { @@ -30,32 +116,37 @@ void run_test(size_t map_size, size_t pass_count, const char* bench_name) { size_t n = map_size + i; // Insert if (i % s_nInsertPercentage == 1) { - auto iter = map->insertOrFind(n); + auto iter = map->insertOrFind(i); if (!iter.getValue()) { iter.assignValue(n); nInsertedNum++; -// std::cout << "Inserted" << n << "\n"; +// std::cout << "Inserted" << i << "\n"; } } // Find { - auto iter = map->find(n); + auto iter = map->find(i); if (iter.getValue()) { ++nFindSuccess; -// std::cout << "Found" << n << "\n"; +// std::cout << "Found" << i << "\n"; } } // Delete if (i % s_nInsertPercentage == 1) { - auto iter = map->find(n); + auto iter = map->find(i); if (iter.getValue()) { iter.eraseValue(); -// std::cout << "Erased" << n << "\n"; +// std::cout << "Erased" << i << "\n"; } } - junction::DefaultQSBR.update(qsbrContext); + if (++nOperations > gc_frequency) { + junction::DefaultQSBR.update(qsbrContext); + nOperations = 0; + } } } + junction::DefaultQSBR.update(qsbrContext); + junction::DefaultQSBR.destroyContext(qsbrContext ); auto finish_time = std::chrono::system_clock::now(); auto dur = finish_time - start_time; auto milisecs = std::chrono::duration_cast(dur); @@ -73,6 +164,13 @@ void run_test(size_t map_size, size_t pass_count, const char* bench_name) { } int main() { - run_test(kGrampaMapSize, kGrampaPassCount, kGrampaBenchmarkName); + run_crude_map(kCrudeMapSize, kCrudePassCount, kCrudeBenchmarkName, + kGCFrequency); + run_test(kLeapfrogMapSize, kLeapfrogPassCount, + kLeapfrogBenchmarkName, kLeapfrogGCFrequency ); + run_test(kLinearMapSize, kLinearPassCount, kLinearBenchmarkName, + kGCFrequency); + run_test(kGrampaMapSize, kGrampaPassCount, kGrampaBenchmarkName, + kGCFrequency); return 0; }