Poco::Stopwatch

開発途上などで、実行速度を測定したい時に便利なクラスを紹介します。

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::ConsoleChannelPoco::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日からのダウンロード数:1070

Subversion

・フリーの Subversion ホスティングサービス Assemblaで、ソースコードを管理しています。

Powered by POCO Copyright © 2010 Round Square Inc. All rights reserved.


  1. Useful stuff, but the theme don’t display correctly on my Powerbook…maybe you need to check that out. Thanks, anyway.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>