1.获取程序块运行时间
思路很简单,就是在程序块的开头和结尾取两次系统时间,然后一减就可以了,取系统时间的方法主要有三种:
(1)秒级
time_t rawtime;
struct tm * timeinfo;
time ( &rawtime );
timeinfo = localtime ( &rawtime );
int secs = timeinfo->tm_sec;
(2)毫秒级
DWORD tm = ::GetTickCount();
(3)毫微级
LARGE_INTEGER tm;
QueryPerformanceCounter(&tm)
计算差值用tm.QuadPart。
2.POD类型与非POD类型对象拷贝构造以及赋值的效率差异
struct Pod1
{int a};
struct Pod2 : Pod1
{int b};
struct Pod3 : Pod2
{int c};
struct Npod1
{
int a;
Npod1(){a=0;}
Npod1(const Npod1& v){a=v.a;}
Npod1& operator=(const Npod1& v)
{
if (this!=&v)this.a=v.a;
return *this;
}
}
struct Npod2 : Npod1
{int b};
struct Npod3 : Npod2
{int c};
template<typename T>
T Copy(T t1, T t2)
{
T t3 = t1;
t1 = t2;
t3 = t1;
return t3;
}
int main()
{
Pod3 p1, p2, p3;
DWORD tm1, tm2;
tm1 = ::GetTickCount();
for (int i=0; i<100000000; ++i)
p3 = Copy(p1, p2);
tm2 = ::GetTickCount();
cout << tm2 - tm1 << endl;
D n1, n2, n3;
tm1 = ::GetTickCount();
for (int i=0; i<100000000; ++i)
n3 = Copy(n1, n2);
tm2 = ::GetTickCount();
cout << tm2 - tm1 << endl;
}
当优化全关的时候,第二种的时间大概是第一种的5倍多,把内联完全打开,第二种的时间大概是第一种的1.6倍。这种差异是由于POD数据可以通过复制整块内存来实现对象的拷贝和复制,而非POD数据,要通过拷贝构造函数和赋值函数的调用来完成,如果类层次较多,调用的函数会很多,即使内联了,也会比较慢。
所以对于底层数据,例如顶点,能够让它处于POD状态,就尽量让它处于POD状态。