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