【C++】打印程序执行时间的两种方法(分别以秒和时钟个数为单位) <time.h> 和 <ctime>

最近调试代码时发现,新架构的实现比旧架构肉眼可见地慢了很多。但是又不确定是哪个环节出了问题。于是,便需要在特定的环境中打印程序语句的执行时间,来对比判断,到底是哪个过程比原来花费了更多的时间。

<time.h> 可以打印秒级时间

起初,我想直接用工程中就有的 <time.h> 头文件的相关接口来打印。具体使用方法如下:

#include <time.h>
// ....
int EncodeOneFrame(uint8_t *frame) {
  time_t beforeaudio, beforeflip, beforeputframe, beforegetpacket, beforeputpacket, last; // 定义几个 time_t 的变量
  time(&beforeaudio); // 这样即可记录程序执行到此条语句的时刻,并存储为 time_t 格式
  while (last_audio_pts_ < last_video_pts_) ProcessAudio();
  time(&beforeflip);
  if (frame) FlipData(image_info_.width, image_info_.height, frame, 4); 
  time(&beforeputframe);
  video_encoder_->PutFrame(frame);
  AVPacket pkt;
  time(&beforegetpacket);
  int ret = video_encoder_->GetPacket(&pkt);
  time(&beforeputpacket);
  if (ret == 0) {
    last_video_pts_ = pkt.pts;
    file_muxer_->PutVideoPacket(&pkt);
  }
  time(&last);
  printf("audio = %f, flip = %f, putframe = %f, getpacket = %f, putpacket = %f", difftime(beforeflip, beforeaudio), 
         difftime(beforeputframe, beforeflip), difftime(beforegetpacket, beforeputframe), difftime(beforeputpacket,
         beforegetpacket), difftime(last, beforeputpacket));
         // difftime 即可求得两个时间点之间的间隔时长,返回以秒为单位的 double 值
  return ret;
}

然而,这么执行后发现,几乎所有结果都是 0。原因在于,这些代码的执行时间大多小于1秒,而 difftime 只能计算比较粗粒度的时间间隔(如有错误,请不吝评论指出)。所以,用 <time.h> 及其相关接口,比较适合较长的程序执行时间的计算和打印。

可以打印 CPU 时钟个数时间

因此,我们需要更细粒度的时间来查看上面的各程序语句的执行时间。因此,可以使用 <ctime> 头文件及其相关接口。具体实现如下:

#include <ctime>
// ....
int EncodeOneFrame(uint8_t *frame) {
  clock_t beforeaudio, beforeflip, beforeputframe ...; // clock_t 其实是 long,是 <ctime> typedef 的变量
  beforeaudio = clock(); // clock_t clock(void) 接口即可记录此刻的 cpu 时钟数绝对值,是该程序启动到此条语句被调用之间所占用的 cpu 时钟数
  while (last_audio_pts_ < last_video_pts_) ProcessAudio();
  beforeflip = clock();
  if (frame) FlipData(image_info_.width, image_info_.height, frame, 4);  
  beforeputframe = clock();
  video_encoder_->PutFrame(frame);
  AVPacket pkt;
  //...
  int ret = video_encoder_->GetPacket(&pkt);
  if (ret == 0) {
    last_video_pts_ = pkt.pts;
    file_muxer_->PutVideoPacket(&pkt);
  } 
  printf("audio = %ld, flip = %ld, ...", beforeflip - beforeaudio, beforeputframe - beforeflip); 
  // 注意 long 需要用 %ld 来打印。
  return ret;
}

如此,便可看到这些语句的执行花费了多少个 CPU 时钟数,便可与之前架构的代码对比,到底是哪个过程比原来花费了更多的时间了。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深海Enoch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值