Linux 下批量计时中的问题(2)使用C++对函数批量计时
- UID
- 1066743
|
Linux 下批量计时中的问题(2)使用C++对函数批量计时
使用C++对函数批量计时C++兼容C,我们同样可以使用上面的方法来解决问题。C++是面向对象的语言,因此,最好把计时功能封装成类来使用,可以参考boost库中定义的timer类。
清单8. timer类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| class timer
{
public:
timer() { _start_time = std::clock(); }
void restart() { _start_time = std::clock(); }
double elapsed() const
{ return double(std::clock() - _start_time) / CLOCKS_PER_SEC; }
double elapsed_max() const
{
return (double(std::numeric_limits<std::clock_t>::max())
- double(_start_time)) / double(CLOCKS_PER_SEC);
}
double elapsed_min() const
{ return double(1)/double(CLOCKS_PER_SEC); }
private:
std::clock_t _start_time;
}; // timer
|
需要注意的是,在C++文件中定义的函数指针指向的是用户自定义类的成员函数。除此之外,其余地方使用方法大致相同。
清单9. 指向成员函数的指针
1
2
3
| int ( CMyClass::*ptMemberFunc )() = &CMyClass::MemberFunc;
CMyClass instance;
(instance.*ptMemberFunc)();
|
还有一点就是,在C++里可以使用vector存储函数指针,不再使用静态数组,vector的作用相当于动态数组,支持对内存的re-allocation。
清单10. 使用vector代替数组
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| #include <vector>
using namespace std;
……
typedef int ( *ptFuncDef )();
vector< ptFuncDef > ptFuncVec;
timer ttimer;
ptFuncVec.push_back( &CMyClass::foobar1 );
ptFuncVec.push_back( &CMyClass::foobar2 );
for (int i = 0; i < ptFuncVec.size(); i++) {
ttimer.restart();
ptFuncVec()
fprintf( fh, "%8.2g\n", ttimer.elasped() );
......
}
|
上面这段代码里,需要多次使用push_back将类成员函数地址置入vector,这是很麻烦的。虽然如此,但其它如设计模式中的一些方法, 或许还包括VPTR,都过于复杂了,对于这样一个问题似乎有些大材小用,因此建议还是以此出发点来考虑这个问题。 |
|
|
|
|
|