如何正确地对[模板化] C程序进行基准测试

前端之家收集整理的这篇文章主要介绍了如何正确地对[模板化] C程序进行基准测试前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
< backgound>

我真的需要优化C代码.我正在为分子模拟编写一个库,我需要添加一个新功能.我过去曾尝试添加功能,但之后我使用了嵌套循环中调用的虚函数.我对此感到不满,第一次实施证明这是一个坏主意.然而,这对于测试概念是可以的.

< /背景>

现在我需要这个功能尽可能快(没有汇编代码或GPU计算,这仍然必须是C,更可读而不是更少).
现在我对模板和类策略有了更多了解(来自Alexandrescu的优秀书籍),我认为编译时代码生成可能是解决方案.

但是,在完成将其实现到库中的大量工作之前,我需要测试设计.问题是测试这个新功能的效率的最佳方法.

显然我需要改进优化,因为如果没有这个g(可能还有其他编译器)会在目标代码中保留一些不必要的操作.我还需要大量使用基准测试中的新功能,因为1e-3秒的增量可以区分好的和坏的设计(在真实程序中这个功能将被称为百万倍).

问题是g在优化时有时“太聪明”,如果考虑到从未使用计算结果,则可以删除整个循环.我在查看输出汇编代码时已经看过了.

如果我向stdout添加一些打印,那么编译器将被强制在循环中进行计算,但我可能主要是对iostream实现进行基准测试.

那么如何对从库中提取的小特征进行正确的基准测试呢?
相关问题:在一个小单元上进行这种体外试验是正确的方法还是我需要整个背景?

谢谢你的建议!

似乎有几种策略,从特定于编译器的选项允许微调到更通用的解决方案,这些解决方案应该适用于volatile或extern等每个编译器.

我想我会尝试所有这些.
非常感谢您的所有答案!

解决方法

如果要强制任何编译器不放弃结果,请将结果写入易失性对象.根据定义,该操作无法优化.
template<typename T> void sink(T const& t) {
   volatile T sinkhole = t;
}

没有iostream开销,只是必须保留在生成代码中的副本.现在,如果您从很多操作中收集结果,最好不要逐个丢弃它们.这些副本仍然可以增加一些开销.相反,以某种方式将所有结果收集在一个非易失性对象中(因此需要所有单独的结果),然后将该结果对象分配给volatile.例如.如果您的各个操作都生成字符串,则可以通过将所有char值一起添加到模数1 << 32来强制进行评估.这几乎不增加任何开销;字符串可能会在缓存中.随后将添加的结果分配为易失性,因此实际上必须计算每个刺中的每个字符,不允许使用快捷方式.

猜你在找的C&C++相关文章