From 27637ed300e7e9af9b6998e73fce13f96b195a30 Mon Sep 17 00:00:00 2001 From: Eliot Horowitz Date: Wed, 9 Jan 2013 12:54:36 -0500 Subject: SERVER-8119: add TimerStats class for collecting timing information --- src/mongo/db/stats/timer_stats.h | 76 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 src/mongo/db/stats/timer_stats.h (limited to 'src/mongo/db/stats/timer_stats.h') diff --git a/src/mongo/db/stats/timer_stats.h b/src/mongo/db/stats/timer_stats.h new file mode 100644 index 00000000000..13b814f89f9 --- /dev/null +++ b/src/mongo/db/stats/timer_stats.h @@ -0,0 +1,76 @@ +// timer_stats.h + +/* Copyright 2012 10gen Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#pragma once + +#include "mongo/db/jsobj.h" +#include "mongo/util/concurrency/spin_lock.h" +#include "mongo/util/timer.h" + +namespace mongo { + + + /** + * Holds timing information in milliseconds + * keeps track of number of times and total milliseconds + * so a diff can be computed + */ + class TimerStats { + public: + void recordMillis( int millis ); + + /** + * @return number of millis + */ + int record( const Timer& timer ); + + BSONObj getReport() const; + operator BSONObj() const { return getReport(); } + + private: + mutable SpinLock _lock; + long long _num; + long long _totalMillis; + }; + + /** + * Holds an instance of a Timer such that we the time is recorded + * when the TimerHolder goes out of scope + */ + class TimerHolder { + public: + TimerHolder( TimerStats* stats ); + ~TimerHolder(); + + /** + * returns elapsed millis from internal timer + */ + int millis() const { return _t.millis(); } + + + /** + * records the time in the TimerStats and marks that we've + * already recorded so the destructor doesn't + */ + int recordMillis(); + + private: + TimerStats* _stats; + bool _recorded; + Timer _t; + }; +} -- cgit v1.2.1