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