首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Linux 下批量计时中的问题(2)使用C++对函数批量计时

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,都过于复杂了,对于这样一个问题似乎有些大材小用,因此建议还是以此出发点来考虑这个问题。
返回列表