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#ifndef STATS_H_ 160d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji#define STATS_H_ 170d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 188380fb8525adfb580af1df23a54f316ab384be06Shinichiro Hamaji#include <mutex> 190d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji#include <string> 200d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 210d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajiusing namespace std; 220d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 230d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajiclass Stats { 240d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji public: 250d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji explicit Stats(const char* name); 260d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 270d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji string String() const; 280d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 290d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji private: 300d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji void Start(); 31b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji double End(); 320d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 330d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji friend class ScopedStatsRecorder; 340d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 350d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji const char* name_; 360d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji double elapsed_; 378c8358d7ace9114afc4c523ac1090ca413d4c075Shinichiro Hamaji int cnt_; 388380fb8525adfb580af1df23a54f316ab384be06Shinichiro Hamaji mutable mutex mu_; 390d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}; 400d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 410d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajiclass ScopedStatsRecorder { 420d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji public: 43b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji explicit ScopedStatsRecorder(Stats* st, const char* msg = 0); 440d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji ~ScopedStatsRecorder(); 450d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 460d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji private: 470d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji Stats* st_; 48b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji const char* msg_; 490d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji}; 500d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 510d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamajivoid ReportAllStats(); 520d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 530d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji#define COLLECT_STATS(name) \ 540d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji static Stats stats(name); \ 550d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji ScopedStatsRecorder ssr(&stats) 560d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji 57b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji#define COLLECT_STATS_WITH_SLOW_REPORT(name, msg) \ 58b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji static Stats stats(name); \ 59b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji ScopedStatsRecorder ssr(&stats, msg) 60b123fe50d41b8bd4236959ad486bf78991389e4dShinichiro Hamaji 610d8e79b7753a89ac6beaf638a535ec63f1941444Shinichiro Hamaji#endif // STATS_H_ 62