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