当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何正确地对[模板化]C++程序进行基准测试》经验,为你挑选了1个好方法。

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

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

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

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

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

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

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

谢谢你的建议!


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

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



1> MSalters..:

如果要强制任何编译器不放弃结果,请将结果写入易失性对象.根据定义,该操作无法优化.

template void sink(T const& t) {
   volatile T sinkhole = t;
}

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

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有