susumu.yata
null+****@clear*****
Thu Nov 27 00:00:41 JST 2014
susumu.yata 2014-11-27 00:00:41 +0900 (Thu, 27 Nov 2014) New Revision: 22f8d28c1c7cf56c8b93d77014076143af6830ad https://github.com/groonga/grnxx/commit/22f8d28c1c7cf56c8b93d77014076143af6830ad Message: Add benchmarks for sorting records in RowID/Score order. (#119) Modified files: benchmark/benchmark_sorter.cpp Modified: benchmark/benchmark_sorter.cpp (+136 -0) =================================================================== --- benchmark/benchmark_sorter.cpp 2014-11-26 23:18:00 +0900 (ad0cd95) +++ benchmark/benchmark_sorter.cpp 2014-11-27 00:00:41 +0900 (c489827) @@ -17,6 +17,7 @@ */ #include <time.h> +#include <algorithm> #include <cassert> #include <iostream> #include <random> @@ -54,6 +55,139 @@ grnxx::Array<grnxx::Record> create_records(grnxx::Table *table) { return records; } +void benchmark_row_id() { + constexpr size_t NUM_ROWS = 1 << 21; + auto db = grnxx::open_db(""); + auto table = db->create_table("Table"); + std::mt19937_64 rng; + for (size_t i = 0; i < NUM_ROWS; ++i) { + table->insert_row(); + } + + { + double best_elapsed = std::numeric_limits<double>::max(); + for (int i = 0; i < 5; ++i) { + std::vector<grnxx::Int> row_ids(NUM_ROWS); + for (size_t i = 0; i < NUM_ROWS; ++i) { + row_ids[i] = grnxx::Int(i); + } + std::shuffle(row_ids.begin(), row_ids.end(), rng); + grnxx::Array<grnxx::Record> records; + records.resize(NUM_ROWS); + for (size_t i = 0; i < NUM_ROWS; ++i) { + records[i].row_id = row_ids[i]; + records[i].score = grnxx::Float(0.0); + } + Timer timer; + auto expression_builder = grnxx::ExpressionBuilder::create(table); + grnxx::Array<grnxx::SorterOrder> orders; + orders.resize(1); + expression_builder->push_row_id(); + orders[0].expression = std::move(expression_builder->release()); + orders[0].type = grnxx::SORTER_REGULAR_ORDER; + auto sorter = grnxx::Sorter::create(std::move(orders)); + sorter->sort(&records); + double elapsed = timer.elapsed(); + if (elapsed < best_elapsed) { + best_elapsed = elapsed; + } + } + std::cout << "RowID" << std::endl; + std::cout << "best elapsed [s] = " << best_elapsed << std::endl; + } +} + +void benchmark_score() { + constexpr size_t NUM_ROWS = 1 << 21; + auto db = grnxx::open_db(""); + auto table = db->create_table("Table"); + std::mt19937_64 rng; + for (size_t i = 0; i < NUM_ROWS; ++i) { + table->insert_row(); + } + + { + double best_elapsed = std::numeric_limits<double>::max(); + for (int i = 0; i < 5; ++i) { + grnxx::Array<grnxx::Record> records = create_records(table); + for (size_t i = 0; i < NUM_ROWS; ++i) { + if ((rng() % 4) != 0) { + records[i].score = grnxx::Float(1.0 * (rng() % 256) / 255); + } + } + Timer timer; + auto expression_builder = grnxx::ExpressionBuilder::create(table); + grnxx::Array<grnxx::SorterOrder> orders; + orders.resize(1); + expression_builder->push_score(); + orders[0].expression = std::move(expression_builder->release()); + orders[0].type = grnxx::SORTER_REGULAR_ORDER; + auto sorter = grnxx::Sorter::create(std::move(orders)); + sorter->sort(&records); + double elapsed = timer.elapsed(); + if (elapsed < best_elapsed) { + best_elapsed = elapsed; + } + } + std::cout << "Score_1" << std::endl; + std::cout << "best elapsed [s] = " << best_elapsed << std::endl; + } + + { + double best_elapsed = std::numeric_limits<double>::max(); + for (int i = 0; i < 5; ++i) { + grnxx::Array<grnxx::Record> records = create_records(table); + for (size_t i = 0; i < NUM_ROWS; ++i) { + if ((rng() % 4) != 0) { + records[i].score = grnxx::Float(1.0 * (rng() % 65536) / 65536); + } + } + Timer timer; + auto expression_builder = grnxx::ExpressionBuilder::create(table); + grnxx::Array<grnxx::SorterOrder> orders; + orders.resize(1); + expression_builder->push_score(); + orders[0].expression = std::move(expression_builder->release()); + orders[0].type = grnxx::SORTER_REGULAR_ORDER; + auto sorter = grnxx::Sorter::create(std::move(orders)); + sorter->sort(&records); + double elapsed = timer.elapsed(); + if (elapsed < best_elapsed) { + best_elapsed = elapsed; + } + } + std::cout << "Score_2" << std::endl; + std::cout << "best elapsed [s] = " << best_elapsed << std::endl; + } + + { + double best_elapsed = std::numeric_limits<double>::max(); + for (int i = 0; i < 5; ++i) { + grnxx::Array<grnxx::Record> records = create_records(table); + for (size_t i = 0; i < NUM_ROWS; ++i) { + if ((rng() % 4) != 0) { + records[i].score = grnxx::Float(1.0 * rng() / rng.max()); + } + } + Timer timer; + auto expression_builder = grnxx::ExpressionBuilder::create(table); + grnxx::Array<grnxx::SorterOrder> orders; + orders.resize(1); + expression_builder->push_score(); + orders[0].expression = std::move(expression_builder->release()); + orders[0].type = grnxx::SORTER_REGULAR_ORDER; + auto sorter = grnxx::Sorter::create(std::move(orders)); + sorter->sort(&records); + double elapsed = timer.elapsed(); + if (elapsed < best_elapsed) { + best_elapsed = elapsed; + } + } + std::cout << "Score_3" << std::endl; + std::cout << "best elapsed [s] = " << best_elapsed << std::endl; + } +} + void benchmark_int() { constexpr size_t NUM_ROWS = 1 << 21; auto db = grnxx::open_db(""); @@ -437,6 +571,8 @@ void benchmark_float() { } int main() { + benchmark_row_id(); + benchmark_score(); benchmark_int(); benchmark_float(); return 0; -------------- next part -------------- HTML����������������������������...Download