这个类统计代码真正运行的时间,如果代码运行过程中cpu被剥夺了,那么被剥夺的那段时间是不计算在内的。
class CStopwatch
{
public:
CStopwatch()
{
Start();
}
__int64 Now() const
{
LARGE_INTEGER liPerNow;
QueryPerformanceCounter(&liPerNow);
return liPerNow.QuadPart - m_liPerStart.QuadPart;
}
private:
void Start()
{
QueryPerformanceCounter(&m_liPerStart);
}
private:
LARGE_INTEGER m_liPerfFreq;
LARGE_INTEGER m_liPerStart;
};
整个小例子吧,C++对于错误通常返回错误码,即一个int值。这样子导致的问题是每调用一次函数需要通过返回值来判断调用是否成功,如果不成功,可能需要返回,但是返回直接需要清理之前申请的资源。每一步都要如此,所以很麻烦。所以有两种方案:
(1)一个是用do while(0)。先申请资源,然后在do while(0)中写逻辑,如果失败,则break,然后在do while结束之后统一资源清理
(2)抛出异常
我比较赞同用一种方案,主要是性能差别。
#include <string>
#include <sstream>
#include <iostream>
#include <queue>
#include <windows.h>
#include <thread>
#include <fstream>
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
int Test()
{
int iRet = 0;
do
{
int a = 1;
iRet = 1;
break;
int b = 2;
} while (0);
return iRet;
}
int Test2()
{
int iRet = 0;
try
{
int a = 1;
throw 1;
int b = 2;
}
catch (...)
{
iRet = 1;
}
return iRet;
}
int main()
{
CStopwatch watch;
Test();
__int64 a = watch.Now();
std::cout << a << std::endl;
CStopwatch watch2;
Test2();
__int64 b = watch2.Now();
std::cout << b << std::endl;
std::cout << "Hello World!\n";
system("pause");
return 1;
}
大家可以运行下程序,感受下如果采用抛出异常处理,代价有多大。