6fc6a27288
Summary: GraphDb is refactored to become an API exposing different parts necessary for the database to function. These different parts can have different implementations in SingleNode or distributed Master/Server GraphDb implementations. Interally GraphDb is implemented using two class heirarchies. One contains all the members and correct wiring for each situation. The other takes care of initialization and shutdown. This architecture is practical because it can guarantee that the initialization of the object structure is complete, before initializing state. Reviewers: buda, mislav.bradac, dgleich, teon.banek Reviewed By: teon.banek Subscribers: pullbot Differential Revision: https://phabricator.memgraph.io/D1093
78 lines
2.4 KiB
C++
78 lines
2.4 KiB
C++
#include <benchmark/benchmark.h>
|
|
#include <benchmark/benchmark_api.h>
|
|
#include <glog/logging.h>
|
|
|
|
#include "communication/result_stream_faker.hpp"
|
|
#include "database/graph_db.hpp"
|
|
#include "database/graph_db_accessor.hpp"
|
|
#include "query/interpreter.hpp"
|
|
#include "query/typed_value.hpp"
|
|
|
|
class ExpansionBenchFixture : public benchmark::Fixture {
|
|
protected:
|
|
// GraphDb shouldn't be global constructed/destructed. See
|
|
// documentation in database/graph_db.hpp for details.
|
|
std::experimental::optional<database::SingleNode> db_;
|
|
query::Interpreter interpeter_;
|
|
|
|
void SetUp(const benchmark::State &state) override {
|
|
db_.emplace();
|
|
database::GraphDbAccessor dba(*db_);
|
|
for (int i = 0; i < state.range(0); i++) dba.InsertVertex();
|
|
|
|
// the fixed part is one vertex expanding to 1000 others
|
|
auto start = dba.InsertVertex();
|
|
start.add_label(dba.Label("Start"));
|
|
auto edge_type = dba.EdgeType("edge_type");
|
|
for (int i = 0; i < 1000; i++) {
|
|
auto dest = dba.InsertVertex();
|
|
dba.InsertEdge(start, dest, edge_type);
|
|
}
|
|
dba.Commit();
|
|
}
|
|
|
|
void TearDown(const benchmark::State &) override {
|
|
database::GraphDbAccessor dba(*db_);
|
|
for (auto vertex : dba.Vertices(false)) dba.DetachRemoveVertex(vertex);
|
|
dba.Commit();
|
|
db_ = std::experimental::nullopt;
|
|
}
|
|
};
|
|
|
|
BENCHMARK_DEFINE_F(ExpansionBenchFixture, Match)(benchmark::State &state) {
|
|
auto query = "MATCH (s:Start) return s";
|
|
database::GraphDbAccessor dba(*db_);
|
|
while (state.KeepRunning()) {
|
|
ResultStreamFaker results;
|
|
interpeter_(query, dba, {}, false).PullAll(results);
|
|
}
|
|
}
|
|
|
|
BENCHMARK_REGISTER_F(ExpansionBenchFixture, Match)
|
|
->RangeMultiplier(1024)
|
|
->Range(1, 1 << 20)
|
|
->Unit(benchmark::kMillisecond);
|
|
|
|
BENCHMARK_DEFINE_F(ExpansionBenchFixture, Expand)(benchmark::State &state) {
|
|
auto query = "MATCH (s:Start) WITH s MATCH (s)--(d) RETURN count(d)";
|
|
database::GraphDbAccessor dba(*db_);
|
|
while (state.KeepRunning()) {
|
|
ResultStreamFaker results;
|
|
interpeter_(query, dba, {}, false).PullAll(results);
|
|
}
|
|
}
|
|
|
|
BENCHMARK_REGISTER_F(ExpansionBenchFixture, Expand)
|
|
->RangeMultiplier(1024)
|
|
->Range(1, 1 << 20)
|
|
->Unit(benchmark::kMillisecond);
|
|
|
|
int main(int argc, char **argv) {
|
|
gflags::ParseCommandLineFlags(&argc, &argv, true);
|
|
google::InitGoogleLogging(argv[0]);
|
|
|
|
::benchmark::Initialize(&argc, argv);
|
|
::benchmark::RunSpecifiedBenchmarks();
|
|
return 0;
|
|
}
|