Repository: incubator-quickstep Updated Branches: refs/heads/adaptive-bloom-filters 871ccac9e -> 2aa3a2d45
updates Project: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/commit/2aa3a2d4 Tree: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/tree/2aa3a2d4 Diff: http://git-wip-us.apache.org/repos/asf/incubator-quickstep/diff/2aa3a2d4 Branch: refs/heads/adaptive-bloom-filters Commit: 2aa3a2d45c0e3ad79a4bb90c35c32a2184d4e6ce Parents: 871ccac Author: Jianqiao Zhu <jianq...@cs.wisc.edu> Authored: Thu Jun 16 01:38:53 2016 -0500 Committer: Jianqiao Zhu <jianq...@cs.wisc.edu> Committed: Thu Jun 16 01:38:53 2016 -0500 ---------------------------------------------------------------------- query_execution/Worker.cpp | 1 - utility/DAGVisualizer.cpp | 38 +++++++++++++++++++++++++++++++++++--- utility/DAGVisualizer.hpp | 2 ++ utility/EventProfiler.hpp | 14 +++++++++----- 4 files changed, 46 insertions(+), 9 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/2aa3a2d4/query_execution/Worker.cpp ---------------------------------------------------------------------- diff --git a/query_execution/Worker.cpp b/query_execution/Worker.cpp index 1372e1d..539d956 100644 --- a/query_execution/Worker.cpp +++ b/query_execution/Worker.cpp @@ -63,7 +63,6 @@ void Worker::run() { line->emplace_back(); message.getWorkOrder()->execute(); line->back().endEvent(); - container->startEvent(message.getRelationalOpIndex()); const std::size_t query_id_for_workorder = message.getWorkOrder()->getQueryID(); delete message.getWorkOrder(); http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/2aa3a2d4/utility/DAGVisualizer.cpp ---------------------------------------------------------------------- diff --git a/utility/DAGVisualizer.cpp b/utility/DAGVisualizer.cpp index 64c235d..ac8da47 100644 --- a/utility/DAGVisualizer.cpp +++ b/utility/DAGVisualizer.cpp @@ -28,6 +28,7 @@ #include <vector> #include "query_optimizer/QueryPlan.hpp" +#include "utility/EventProfiler.hpp" #include "utility/StringUtil.hpp" #include "glog/logging.h" @@ -48,22 +49,34 @@ std::string DAGVisualizer::toDOT() { std::vector<double> time_elapsed(num_nodes, 0); std::vector<double> time_percentage(num_nodes, 0); + std::vector<double> time_start(num_nodes, std::numeric_limits<double>::max()); + std::vector<double> time_end(num_nodes, 0); + const auto &zero_time = relop_profiler.zero_time(); for (const auto &container : relop_profiler.containers()) { for (const auto &line : container.second.events) { + const std::size_t relop_index = line.first; for (const auto &event : line.second) { - time_elapsed[line.first] += - std::chrono::duration<double>(event.start_time - event.end_time).count(); + time_elapsed[relop_index] += + std::chrono::duration<double>(event.end_time - event.start_time).count(); + time_start[relop_index] = + std::min(time_start[relop_index], + std::chrono::duration<double>(event.start_time - zero_time).count()); + time_end[relop_index] = + std::max(time_end[relop_index], + std::chrono::duration<double>(event.end_time - zero_time).count()); } } } const std::size_t num_threads = relop_profiler.containers().size(); double total_time_elapsed = 0; + double max_percentage = 0; for (std::size_t i = 0; i < time_elapsed.size(); ++i) { time_elapsed[i] /= num_threads; total_time_elapsed += time_elapsed[i]; } for (std::size_t i = 0; i < time_elapsed.size(); ++i) { time_percentage[i] = time_elapsed[i] / total_time_elapsed; + max_percentage = std::max(max_percentage, time_percentage[i]); } std::vector<bool> display_ops(num_nodes, false); @@ -71,12 +84,23 @@ std::string DAGVisualizer::toDOT() { const std::string relop_name = dag.getNodePayload(node_index).getName(); if (no_display_op_names.find(relop_name) == no_display_op_names.end()) { display_ops[node_index] = true; + nodes_.emplace_back(); NodeInfo &node_info = nodes_.back(); node_info.id = node_index; + + std::string hue = + std::to_string(time_percentage[node_index] / max_percentage); + node_info.color = hue + " " + hue + " 1.0"; + node_info.labels.emplace_back(relop_name); node_info.labels.emplace_back( - std::to_string(std::lround(time_elapsed[node_index] / 100))); + std::to_string(std::lround(time_elapsed[node_index] * 1000)) + + "ms (" + PercentageToString(time_percentage[node_index] * 100) + "%)"); + node_info.labels.emplace_back( + "span: [" + + std::to_string(std::lround(time_start[node_index] * 1000)) + "ms, " + + std::to_string(std::lround(time_end[node_index] * 1000)) + "ms]"); } } for (std::size_t node_index = 0; node_index < num_nodes; ++node_index) { @@ -135,4 +159,12 @@ std::string DAGVisualizer::toDOT() { return graph_oss.str(); } +std::string DAGVisualizer::PercentageToString(double percentage) { + std::ostringstream oss; + oss << static_cast<std::uint32_t>(percentage) << "."; + int digits = std::lround(percentage * 10000) % 100; + oss << digits / 10 << digits % 10; + return oss.str(); +} + } // namespace quickstep http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/2aa3a2d4/utility/DAGVisualizer.hpp ---------------------------------------------------------------------- diff --git a/utility/DAGVisualizer.hpp b/utility/DAGVisualizer.hpp index 5736f4b..3e80c4d 100644 --- a/utility/DAGVisualizer.hpp +++ b/utility/DAGVisualizer.hpp @@ -49,6 +49,8 @@ class DAGVisualizer { std::string toDOT(); private: + static std::string PercentageToString(double percentage); + /** * @brief Information of a graph node. */ http://git-wip-us.apache.org/repos/asf/incubator-quickstep/blob/2aa3a2d4/utility/EventProfiler.hpp ---------------------------------------------------------------------- diff --git a/utility/EventProfiler.hpp b/utility/EventProfiler.hpp index cd5b1e2..549033c 100644 --- a/utility/EventProfiler.hpp +++ b/utility/EventProfiler.hpp @@ -47,7 +47,7 @@ class EventProfiler { public: EventProfiler() - : zero_time(clock::now()) { + : zero_time_(clock::now()) { } struct EventInfo { @@ -117,9 +117,9 @@ class EventProfiler { PrintTuple(event_info.payload, ","); - os << std::chrono::duration<double>(event_info.start_time - zero_time).count() + os << std::chrono::duration<double>(event_info.start_time - zero_time_).count() << "," - << std::chrono::duration<double>(event_info.end_time - zero_time).count() + << std::chrono::duration<double>(event_info.end_time - zero_time_).count() << "\n"; } } @@ -128,7 +128,7 @@ class EventProfiler { } void clear() { - zero_time = clock::now(); + zero_time_ = clock::now(); thread_map_.clear(); } @@ -136,6 +136,10 @@ class EventProfiler { return thread_map_; } + const clock::time_point &zero_time() { + return zero_time_; + } + private: template<class Tuple, std::size_t N> struct TuplePrinter { @@ -157,7 +161,7 @@ class EventProfiler { TuplePrinter<decltype(t), sizeof...(Args)>::Print(t, sep); } - clock::time_point zero_time; + clock::time_point zero_time_; std::map<std::thread::id, EventContainer> thread_map_; Mutex mutex_; };