mal*_*lat 5 c gcc unit-testing jenkins
我一直在研究一个可以进行图像处理的便携式C库.
我在一些低级功能上投入了相当多的时间,以便利用GCC自动矢量化(SSE和/或AVX,取决于目标处理器)模式,同时仍保留一些可移植的C代码(使用的扩展名:restrict
和__builtin_assume_aligned
) .
现在是时候测试Windows上的代码(MSVC编译器).但在此之前,我想设置一些单元测试,以免在脚下射击并松开我所有精心选择的指令,以保持GCC自动矢量化代码的原样.
我可以简单地#ifdef/#endif
使用整个身体功能,但我正在考虑一个更长期的解决方案,可以检测任何回归的编译器更新.
我对单元测试非常有信心(那里有很多好的框架),但我对这种低级功能的单元测试信心不足.如何在CI服务中集成性能单元测试,如jenkins?
PS:我想避免存储基于特定处理器的硬编码时序结果,例如:
// start timer:
gettimeofday(&t1, NULL);
// call optimized function:
...
// stop timer:
gettimeofday(&t2, NULL);
// hard code some magic number:
if( t2.tv_sec - t1.tv_sec > 42 ) return EXIT_FAILURE;
Run Code Online (Sandbox Code Playgroud)
你的问题基本上可以归结为两部分:
对精心优化的代码进行性能基准测试的最佳方法是什么?
如何比较比较结果,以便您可以检测代码更改和/或编译器更新是否影响了代码的性能
谷歌基准测试框架可能为问题#1提供合理的方法。它是 C++,但这不会阻止您从中调用 C 函数。
该库可以生成各种格式的摘要报告,包括 JSON 和传统的 CSV。您可以安排将它们存储在每次运行的某个地方。
然后,您可以编写一个简单的 perl/python/etc 脚本来比较基准测试的结果,并在偏差超过某个阈值时发出警报。
您必须小心的一件事是,执行测试的系统上的负载等变量可能会导致结果中出现噪音。您没有详细说明正在运行测试的环境,但如果它(例如)是包含其他虚拟机的主机上的虚拟机,那么您的测试结果可能会因其他虚拟机中发生的情况而产生偏差。
Jenkins 等 CI 框架允许您编写运行测试时要采取的操作的脚本,因此将此方法集成到此类框架中应该相对容易。