网站导航:首页 -> 软件水平考试 -> 系统工程师考试认证 -> C++Q&A:性能监视

C++Q&A:性能监视

  我描述了一个称为 showtime 的类,你可以用它来为你的应用程序执行一些简单的性能监视。showtime 用它的构造函数/析构函数来记录它存在的开始/结束时间,因此你可以在代码块中这样来实例化:
      {
showtime st(_t('total time is:'));
// some lengthy operation
}
  你便会获得 trace 消息或日志文件,它会记录这样一条日志:“共耗时是:nnn 毫秒”,这个nnn 是从实例在栈上创建开始之时到析构函数调用之时的毫秒数。
  showtime 使用了 crt::clock 函数以获得自从进程启动后的毫秒数。正如我指出的,对于精度计时来说,::clock 并不是最精确 的函数。我从没有建议过其它可使用的计时函数,因为当时::clock足以充分说明我所回答的问题。但是读者 robert bocquier 指出这里有一个更好的函数: timegettime。


figure 1 时间输出

  robert 说这是他编写音乐应用程序的经验:根据你运行的 windows® 平台/版本,::clock 的粒度可能会高达 10 毫秒 ;而 timegettime 更精确。perftest.cpp 是一个简单的程序,它可以从 msdn杂志代码中下载获得,它举例说明了这个问题(感谢robert提供了 此测试思路)。perftest 展示只要时间一改变,它便会显示一条消息,先用::clock,然后用 timegettime。正如你从 figure 1 中 所看到的范例输出那样,在我运行 windows xp 的机器上,::clock 的粒度为10毫秒;而 timegettime 的粒度为 1 毫秒。唯一的差别是你必须首先调用 timebeginperiod 来设置你所想要的粒度,并在结束时调用 timeendperiod。
        timebeginperiod(1);
// ... run performance testtimeendperiod(1);
  每次调用 timebeginperiod 后都必须以相同的粒度值配对调用 timeendperiod。在我的机器上,粒度的默认值为10毫秒(和 ::clock 一样),所以如果 你不想出什么差错,最好不要忘记调用timebeginperiod。timexxx 函数是 windows 多媒体支持的一部分,因此你必须 #include mmsystem.h 并链接 winmm.lib 库。这里有一个技巧,你可以用它来告诉连接器从源代码模块中包含某个特定的库——而不是向工程设置中添加库。它就是 使用 #pragma 声明,像下面这样:
        // tell linker to use winmm.lib
#pragma comment( lib, 'winmm' )
  #pragma 声明有多种其有用的选项,你应该根据自己的情况选择使用;lib 选项填入一个库搜索记录到你的模块对象文件中。我写了一个新版本的 showtime,它使用 timegettime 和 pragma 来连接 winmm.lib。showtime 构造函数现在 有一个粒度参数,showtime 将该参数传递给 timebeginperiod (默认值=1)。(perftest 用 showtime 来测算分配 大批量字符串的时间。)