在VC2010上利用运行时程序性能分析工具对HM编码器进行性能分析,获取代码的关键路径,为后面对算法和代码进行优化提供参考。
参考程序版本为HM-10.1-dev,分析工具为VC2010集成代码性能分析工具,测试序列为BQSquare_416x240_60,配置文件为encoder_intra_main.cfg和BQSquare.cfg。
有人反映VC跑测试软件编码器非常慢,需要几个小时,我测试了一下是这样的,我使用上面的测试序列和配置文件,运行编码器耗时6236s。电脑配置为Intel(R) Core(TM) i7-3770 CPU @ 3.40GHz 八核处理器,3.39GHz, 3.40GB内存,WindowsXPSP3系统。这么小的一个视频编码耗时1.8小时,也太慢了,编码时电脑CUP占用率13%,说明代码有很多的优化潜力。后来看了下VC设置看能不能设置优化的,然后看到方案默认为Debug模式,其他优化选项好像是正常的,就将Debug改为Release模式,在编译运行上面同样的序列和配置,耗时630s,电脑CPU占用率还是13%,速度差不多快了10倍,确实是减少时间的方法,应该还是可以优化的。
下面继续VC2010进行程序性能分析。
电脑配置:
参数配置:
-c encoder_intra_main.cfg -c BQSquare.cfg 612x240x60
运行编码器:
VC2010中Debug模式运行编码器,612x240x60序列,耗时6226s
VC2010中Release模式运行编码器,612x240x60序列,耗时623s,相差10倍了
两种模式下CPU占用率差不多
启动VC性能分析工具进行HM性能分析:
关键路径:
TAppEncoder.exe 187,486
main: 187,034
-- TAppEncTop::encode() 187,034
--TEncGOP::compressGOP() 186,972
--TEncSlice::compressSlice() 185,016
--TEncCu::xCheckRDCostIntra() 18,236
--TEncSearch::estIntraPredChromaQT 2,062
--TEncSearch::estIntraPredQT 15,894
--TEncCu::xCompressCU() 165,893
--TEncCu::xCheckRDCostIntra() 109,110
--TEncSearch::estIntraPredChromaQT 11,853
--TEncSearch::extIntraPredQT() 96,206
--TEncSearch::xRecurIntraCodingQT() 75,052
--TComPrediction::preIntraLumaAng() 5,909
--TComRdCost::calcHAD() 5,276
换一个配置文件测试:
-c encoder_lowdelay_main.cfg -c BQSquare.cfg 612x240x60
使用这个配置文件时,分析得到的关键路径与之前的路径差别较大,但是对比函数调用关系树的话还是差不多的。
主要消耗还是compressCU函数
编码器测试:
使用编码器对-c encoder_intra_main.cfg -c BQSquare.cfg 612x240x60序列编码文件解码:
解码总共耗时8s,CPU占用率13%
解码速度还是可以的,但这个YUV图像大小很小,需要测试更大尺寸的序列,同时使用更高性能的配置参数进行编码和解码测试。
来对比一下编解码图像质量
编解码后第一帧:
整体上和原始图像差不多,注意地板的纹理,编解码后地板在亮区的纹理已经没有了,在暗区如左下角太阳伞下纹理还可以看到。
原始YUV序列第500帧:
编解码后YUV序列第500帧:
可以看出阳台瓷砖纹理、雨伞纹理、铁栅栏纹理和水面纹理都有了不同程度的模糊。