10d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// Copyright 2015 Google Inc. All rights reserved
20d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji//
30d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// Licensed under the Apache License, Version 2.0 (the "License");
40d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// you may not use this file except in compliance with the License.
50d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// You may obtain a copy of the License at
60d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji//
70d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji//      http://www.apache.org/licenses/LICENSE-2.0
80d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji//
90d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// Unless required by applicable law or agreed to in writing, software
100d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// distributed under the License is distributed on an "AS IS" BASIS,
110d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
120d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// See the License for the specific language governing permissions and
130d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// limitations under the License.
140d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
150d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji// +build ignore
160d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
170d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji#include "stats.h"
180d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
192d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen#include <algorithm>
208380fb8525adfb580af1df23a54f316ab384be06Shinichiro Hamaji#include <mutex>
210d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji#include <vector>
220d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
239588ae9845937c2fc3d7bc84061740eaf9aeb4b8Shinichiro Hamaji#include "flags.h"
240d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji#include "log.h"
250d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji#include "stringprintf.h"
26545b6a29c829b9fade0f1405e638f86c8f4668b1Shinichiro Hamaji#include "thread_local.h"
27cbd34cdefdbbf9c3802c6d8428a79d2efaa99b6bShinichiro Hamaji#include "timeutil.h"
280d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
290d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajinamespace {
300d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
318380fb8525adfb580af1df23a54f316ab384be06Shinichiro Hamajimutex g_mu;
320d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajivector<Stats*>* g_stats;
33545b6a29c829b9fade0f1405e638f86c8f4668b1Shinichiro HamajiDEFINE_THREAD_LOCAL(double, g_start_time);
340d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
350d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}  // namespace
360d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
373ce083f01d6e62e9fb9b328e312d97a074fe6128Dan WillemsenStats::Stats(const char* name) : name_(name), elapsed_(0), cnt_(0) {
388380fb8525adfb580af1df23a54f316ab384be06Shinichiro Hamaji  unique_lock<mutex> lock(g_mu);
390d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji  if (g_stats == NULL)
400d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji    g_stats = new vector<Stats*>;
410d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji  g_stats->push_back(this);
420d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}
430d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
442d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsenvoid Stats::DumpTop() const {
452d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen  unique_lock<mutex> lock(mu_);
462d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen  if (detailed_.size() > 0) {
472d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen    vector<pair<string, double>> v(detailed_.begin(), detailed_.end());
482d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen    sort(
492d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen        v.begin(), v.end(),
502d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen        [](const pair<string, double> a, const pair<string, double> b) -> bool {
512d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen          return a.second > b.second;
522d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen        });
532d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen    for (unsigned int i = 0; i < 10 && i < v.size(); i++) {
542d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen      LOG_STAT(" %5.3f %s", v[i].first.c_str(), v[i].second);
552d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen    }
562d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen  }
572d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen}
582d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen
590d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajistring Stats::String() const {
608380fb8525adfb580af1df23a54f316ab384be06Shinichiro Hamaji  unique_lock<mutex> lock(mu_);
618c8358d7ace9114afc4c523ac1090ca413d4c075Shinichiro Hamaji  return StringPrintf("%s: %f / %d", name_, elapsed_, cnt_);
620d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}
630d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
640d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajivoid Stats::Start() {
65545b6a29c829b9fade0f1405e638f86c8f4668b1Shinichiro Hamaji  CHECK(!TLS_REF(g_start_time));
66545b6a29c829b9fade0f1405e638f86c8f4668b1Shinichiro Hamaji  TLS_REF(g_start_time) = GetTime();
678380fb8525adfb580af1df23a54f316ab384be06Shinichiro Hamaji  unique_lock<mutex> lock(mu_);
688c8358d7ace9114afc4c523ac1090ca413d4c075Shinichiro Hamaji  cnt_++;
690d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}
700d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
712d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsendouble Stats::End(const char* msg) {
72545b6a29c829b9fade0f1405e638f86c8f4668b1Shinichiro Hamaji  CHECK(TLS_REF(g_start_time));
73545b6a29c829b9fade0f1405e638f86c8f4668b1Shinichiro Hamaji  double e = GetTime() - TLS_REF(g_start_time);
74545b6a29c829b9fade0f1405e638f86c8f4668b1Shinichiro Hamaji  TLS_REF(g_start_time) = 0;
758380fb8525adfb580af1df23a54f316ab384be06Shinichiro Hamaji  unique_lock<mutex> lock(mu_);
76b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji  elapsed_ += e;
772d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen  if (msg != 0) {
782d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen    detailed_[string(msg)] += e;
792d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen  }
80b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji  return e;
810d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}
820d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
83b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro HamajiScopedStatsRecorder::ScopedStatsRecorder(Stats* st, const char* msg)
84b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji    : st_(st), msg_(msg) {
859588ae9845937c2fc3d7bc84061740eaf9aeb4b8Shinichiro Hamaji  if (!g_flags.enable_stat_logs)
869588ae9845937c2fc3d7bc84061740eaf9aeb4b8Shinichiro Hamaji    return;
870d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji  st_->Start();
880d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}
890d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
900d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro HamajiScopedStatsRecorder::~ScopedStatsRecorder() {
919588ae9845937c2fc3d7bc84061740eaf9aeb4b8Shinichiro Hamaji  if (!g_flags.enable_stat_logs)
929588ae9845937c2fc3d7bc84061740eaf9aeb4b8Shinichiro Hamaji    return;
932d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen  double e = st_->End(msg_);
94b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji  if (msg_ && e > 3.0) {
95b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji    LOG_STAT("slow %s (%f): %s", st_->name_, e, msg_);
96b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji  }
970d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}
980d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji
990d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajivoid ReportAllStats() {
1000d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji  if (!g_stats)
1010d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji    return;
1020d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji  for (Stats* st : *g_stats) {
1030d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji    LOG_STAT("%s", st->String().c_str());
1042d552dbab1acaa6ce19560a5345cbf40c4cd8fadDan Willemsen    st->DumpTop();
1050d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji  }
1060d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji  delete g_stats;
1070d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}
108