c - 如何在 C 语言中对性能优化进行单元测试?

标签 c unit-testing gcc jenkins

我一直在研究一个可移植的 C 语言库,它可以进行图像处理。

我在几个低级函数上投入了相当多的时间,以便利用 GCC 自动矢量化(SSE 和/或 AVX,具体取决于目标处理器)模式,同时仍然保留可移植的 C 代码(使用的扩展: restrict__builtin_assume_aligned).

现在是时候在 Windows 上测试代码了(MSVC 编译器)。但在此之前,我想设置某种单元测试,以免搬起石头砸自己的脚,松开所有我精心选择的指令,以按原样保留 GCC 自动矢量化代码。

我可以简单地 #ifdef/#endif 整个主体功能,但我正在考虑一个更长期的解决方案,可以在编译器更新时检测任何回归。

我对单元测试相当有信心(那里有很多好的框架),但我对这种低级功能的单元测试不太有信心。如何在jenkins等CI服务中集成性能单元测试?

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;

最佳答案

您的问题基本上可以归结为两部分:

  1. 对精心优化的代码进行性能基准测试的最佳方法是什么?

  2. 如何比较比较结果,以便检测代码更改和/或编译器更新是否影响了代码的性能

google benchmark框架可能会为问题 #1 提供合理的方法。它是 C++,但这不会阻止您从中调用 C 函数。

此库可以生成各种格式的摘要报告,包括 JSON 和良好的旧 CSV。您可以安排将这些存储在每次运行的某个地方。

然后您可以编写一个简单的 perl/python/etc 脚本来比较基准测试的结果,并在它们偏离超过某个阈值时发出警报。

您必须注意的一件事是,执行测试的系统上的负载等变量可能会导致结果中出现噪音。您对运行测试的环境没有说太多,但是如果它(例如)是包含其他 VM 的主机上的 VM,那么您的测试结果可能会因其他 VM 中发生的事情而出现偏差。

Jenkins 等 CI 框架允许您编写运行测试时要采取的操作的脚本,因此将这种方法集成到此类框架中应该相对容易。

关于c - 如何在 C 语言中对性能优化进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35557041/

相关文章:

C - 链表打印顺序错误

c - 读取 GPIOB_IDR 寄存器时的值不正确

C++ 常量问题

c - 将 gcc 调试构建选项从 -ggdb3 更改为 -g3 -gdwarf-2 是否会产生负面影响?

c - 如何编写返回指针数组的回调函数?

c - 如何将结构体的数组变量传递给另一个函数?

azure - 使用 Moq 在 Azure 函数中为委托(delegate)编写 Mock

Python Kafka 模拟 Kafka Consumer 的返回类型

python - 为什么 IDLE 不需要 'if __name__ == "__main__": to run a test case, 但 PyCharm 需要?

c++ vector.push_back 错误: request for member 'push_back' . ..,属于非类类型 'vector(char, allocator(char)) ()()'