A C++ class for more precise time interval measurement
2007-10-21 11:31
369 查看
Download demo project - 5 Kb
csdn的下载地址:http://download.csdn.net/source/267438
The constructor
The function
The function
The function
The function
I am using my own function
![](http://www.codeproject.com/images/minus.gif)
Collapse
It is capable to display
You can also use in MFC applications the
or a stdlib function
csdn的下载地址:http://download.csdn.net/source/267438
Introduction
This timer class is capable to measure time intervals in microseconds under Windows OS. It is using the less known Windows API functionsQueryPerformanceFrequency()and
QueryPerformanceCounter()for getting the frequency and respectively the counts of the high-resolution performance counter. For systems where such a high-resolution performance counter is not available, the more known API function
GetTickCounts()is used instead, but with a performance penalty on the timer's precision. The reliability of the timer is depending anyway on the system's hardware performance, i.e. the accuracy is increased for systems with higher processor frequency. The class is also demonstrating some useful tips about using the
__int64integers in VC++.
Implementation
Here I present only the public user interface of theCPreciseTimerclass, the implementation details being in the demo project source files:
class CPreciseTimer
![]()
...{
public:
CPreciseTimer();
bool SupportsHighResCounter();
void StartTimer();
void StopTimer();
__int64 GetTime();
};
The constructor
CPreciseTimer()at the first class's instance construction is also determining if the high-resolution performance counter is available, and in the favorable case is initializing the frequency member variable. Subsequent constructions are not repeating this computation block.
The function
SupportsHighResCounter()is returning true only if the high-resolution performance counter is available. It is giving to the user a clue about the accuracy of the timer.
The function
StartTimer(), as the name says, is starting the timer.
The function
StopTimer()is stopping the timer, also keeping the elapsed time since the timer was started.
The function
GetTime()in case the timer is in the running state is returning the time interval since the timer was started. If the timer is in the stopped state then it is returning the time difference between the last stop call and the last start call. The returned value is in microseconds, but it cannot be trusted if the high-resolution performance counter is not available, case for which the accuracy cannot be in fact higher than the order of milliseconds.
How to use it
The following code snippet is showing a simple use example:CPreciseTimer oPreciseTimer;
cout << "Starting!" << endl;
oPreciseTimer.StartTimer();
::Sleep(5000);
cout << "Ending!" << endl;
oPreciseTimer.StopTimer();
__int64 i64Diff = oPreciseTimer.GetTime();
cout << "Diff=" << Int64ToString(i64Diff) << endl;
return 0;
I am using my own function
Int64ToString()for displaying
__int64numbers. I also give this function for free use below:
![](http://www.codeproject.com/images/minus.gif)
Collapse
string Int64ToString(__int64 const& ri64, int iRadix=10)
![]()
...{
bool bNeg = (ri64 < 0);
__int64 i64 = ri64;
string ostrRes;
bool bSpecial = false;
if(true == bNeg)
![]()
...{
i64 = -i64;
if(i64 < 0)
// Special case number -9223372036854775808 or
// 0x8000000000000000
bSpecial = true;
ostrRes.append(1, '-');
}
int iR;
do
![]()
...{
iR = i64 % iRadix;
if(true == bSpecial)
iR = -iR;
if(iR < 10)
ostrRes.append(1, '0' + iR);
else
ostrRes.append(1, 'A' + iR - 10);
i64 /= iRadix;
}
while(i64 != 0);
//Reverse the string
string::iterator it = ostrRes.begin();
if(bNeg)
it++;
reverse(it, ostrRes.end());
return ostrRes;
}
It is capable to display
__int64values in any radix base (the default radix base being 10).
__int64values can also be displayed using the
printf()function as in the following code snippet:
__int64 i64 = 0x7fffffffffffffff;
printf("Decimal Value = %I64d ", i64);
printf("Hexa Value = %I64x ", i64);
You can also use in MFC applications the
Format()function of
CString:
CString str;
str.Format("%I64d", 4294967307);
or a stdlib function
_i64toa()which is similar to
itoa():
__int64 i64 = 4294967307;
char szBuff[20];
_i64toa(i64, szBuff, 10);
Conclusion
The project attached to this article contains the source code of the presentedCPreciseTimerclass and test code. I am interested in any opinions and new ideas about this implementation.
相关文章推荐
- RtAudio介绍(A Cross-Platform C++ Class for Realtime Audio Input/Output)
- RtAudio介绍(A Cross-Platform C++ Class for Realtime Audio Input/Output)
- Tune TCP time wait interval for high-load environments (HP-UX, Linux, Solaris, Windows)
- Class for Time
- An error has occurred. See error log for more details. java.lang.IncompatibleClassChangeError
- write a String class by c++(study for c++)
- C++ Timesaving Techniques For Dummies
- Question 31: A C++ developer wants to handle a static_cast() operation for the class String shown below. Which of the following
- (转)13 Tips For More Effective Time Management
- C++重载运算符“<<”,for your class/struct
- More Effective C++(条款26:限制某个class所能产生的对象个数)
- sleep(), usleep()和[NSThread sleepForTimeInterval:]
- Dynamic Class Loading for C++ on Linux
- More Effective C++ 条款26 限制某个class所能产生的对象数量
- P Laguna/ A database for evaluation of algorithms for measurement of QT and other waveform interval
- C++: member function pointer for SomeClass
- What happens when more restrictive access is given to a derived class method in C++?
- NSDate、NSTimeInterval、NSDateFormatter、NSLocale 、NSTimeZone、NSDateComponents详解
- A template class for binding C++ to Lua
- why it doesn't popup multi definitions error for method in .h class for C++?