我一直在开发一个可移植的C库,用于图像处理。我花费了相当多的时间来编写几个低级函数,以便利用GCC自动向量化模式(根据目标处理器使用SSE和/或AVX),同时仍保留了一些可移植的C代码(使用的扩展:restrict和__builtin_assume_aligned)。
现在是时候在Windows上测试代码了(使用MSVC编译器)。但在此之前,我想设置某种单元测试,以避免出现问题,并且不会因为疏忽而丢失所有精心选择的指令,以便保留GCC自动向量化代码。
我可以简单地使用#ifdef / #endif隐藏整个函数体,但我考虑更长远的解决方案,该方案将检测编译器更新时的任何退化。
我对单元测试相当有信心(有大量优秀的框架可用),但对此类低级功能的单元测试则不太自信。如何在诸如Jenkins之类的CI服务中集成性能单元测试?
注:我希望避免存储基于特定处理器的硬编码计时结果。
现在是时候在Windows上测试代码了(使用MSVC编译器)。但在此之前,我想设置某种单元测试,以避免出现问题,并且不会因为疏忽而丢失所有精心选择的指令,以便保留GCC自动向量化代码。
我可以简单地使用#ifdef / #endif隐藏整个函数体,但我考虑更长远的解决方案,该方案将检测编译器更新时的任何退化。
我对单元测试相当有信心(有大量优秀的框架可用),但对此类低级功能的单元测试则不太自信。如何在诸如Jenkins之类的CI服务中集成性能单元测试?
注:我希望避免存储基于特定处理器的硬编码计时结果。
// 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;
t_opt
预计会小于t_non_opt
...但即使如此也不能百分之百保证。其他进程可能会同时进行随机磁盘访问,你的测试随时可能被抢占...还有一堆其他事情可能发生在你的测试之外... - zaufi