開発途上などで、実行速度を測定したい時に便利なクラスを紹介します。
class ScopedElapsedTime
ScopedElapsedTime.h
・PImpl イディオム(pointer to implementation idiom)を使用し、ファイルの依存関係を削減。
#include <string> #include <memory> #include "Poco/Timestamp.h" class ScopedElapsedTime { public: ScopedElapsedTime( const std::string& commonMsg, const std::string& startMsg, const std::string& endMsg); ~ScopedElapsedTime(); void Message(const std::string& msg) const; Poco::Timestamp::TimeDiff elapsed() const; int elapsedSeconds() const; private: ScopedElapsedTime(); ScopedElapsedTime(const ScopedElapsedTime&); ScopedElapsedTime& operator = (const ScopedElapsedTime&); class ScopedElapsedTimeImpl; std::auto_ptr<ScopedElapsedTimeImpl> m_pImpl; }; |
ScopedElapsedTime.cpp
・Poco::Stopwatch と ScopedLogMessage を継承した ScopedElapsedTime::ScopedElapsedTimeImpl のデストラクタで、経過時間を表示。
#include "ScopedElapsedTime.h" #include "ScopedLogMessage.h" #include <Poco/Stopwatch.h> #include <Poco/Format.h> class ScopedElapsedTime::ScopedElapsedTimeImpl : public ScopedLogMessage, public Poco::Stopwatch { public: ScopedElapsedTimeImpl( const std::string& commonMsg, const std::string& startMsg, const std::string& endMsg) : ScopedLogMessage(commonMsg, startMsg, endMsg) { start(); } ~ScopedElapsedTimeImpl() { stop(); Message(Poco::format(" Elepsed time = %.3fmSec", (1000.0 * elapsed()) / resolution())); } private: ScopedElapsedTimeImpl(); ScopedElapsedTimeImpl(const ScopedElapsedTimeImpl&); ScopedElapsedTimeImpl& operator = (const ScopedElapsedTimeImpl&); }; ScopedElapsedTime::ScopedElapsedTime( const std::string& commonMsg, const std::string& startMsg, const std::string& endMsg) : m_pImpl(new ScopedElapsedTimeImpl(commonMsg, startMsg, endMsg)) { } ScopedElapsedTime::~ScopedElapsedTime() { } void ScopedElapsedTime::Message(const std::string& msg) const { m_pImpl->Message(msg); } Poco::Timestamp::TimeDiff ScopedElapsedTime::elapsed() const { return m_pImpl->elapsed(); } int ScopedElapsedTime::elapsedSeconds() const { return m_pImpl->elapsedSeconds(); } |
ScopedElapsedTimeTest.cpp
・Poco::Logger::ROOT という名称で Poco::ConsoleChannel に Poco::Message::PRIO_INFORMATION
以上のログを出す Poco::Logger を生成し、ScopedElapsedTime を呼ぶ。
・一つ目の ScopedElapsedTime で、最小分解能をチェック。
・Windows では、何もしないと最小分解能チェック結果が 0 になってしまうので、while ループを
追加して、実質の最小分解能になるように調整。
・二つ目の ScopedElapsedTime で、300mSec のスリープを入れた場合をチェック。
#include <Poco/Thread.h> #include "ScopedElapsedTime.h" #include "PrepareConsoleLogger.h" //---------------------------------------- // main //---------------------------------------- int main(int /*argc*/, char** /*argv*/) { PrepareConsoleLogger logger(Poco::Logger::ROOT, Poco::Message::PRIO_INFORMATION); { ScopedElapsedTime msg("ScopedElapsedTime ", "start [maximum precision check]", "end"); #if defined(POCO_OS_FAMILY_WINDOWS) while(0 == msg.elapsed()) ; #endif } { ScopedElapsedTime msg("ScopedElapsedTime ", "start [Poco::Thread::sleep(300) check]", "end"); Poco::Thread::sleep(300); } return 0; } |
Results of execution
[0] ScopedElapsedTime start [maximum precision check] [0] Elepsed time = 0.002mSec [0] ScopedElapsedTime end [0] ScopedElapsedTime start [Poco::Thread::sleep(300) check] [0] Elepsed time = 300.063mSec [0] ScopedElapsedTime end |
Downloads
・ここをクリックすると、makefile や VC++ プロジェクトなど一式がダウンロードできます。
(2013.05.31 updated)
・2010年4月29日からのダウンロード数:1397
Subversion
・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。
![]() |
Copyright © 2010 Round Square Inc. All rights reserved. |
---|
Useful stuff, but the theme don’t display correctly on my Powerbook…maybe you need to check that out. Thanks, anyway.