<背景>
我正处于我真正需要优化 C++ 代码的地步。我正在编写一个用于分子模拟的库,我需要添加一个新功能。过去我已经尝试添加此功能,但后来我使用了嵌套循环中调用的虚函数。我对此有不好的感觉,第一次实施证明这是一个坏主意。然而,这对于测试这个概念来说是可以的。
</背景>
现在我需要这个功能尽可能快(没有汇编代码或 GPU 计算,这仍然必须是 C++ 并且比更少的可读性更强)。现在我对模板和类策略有了更多的了解(来自 Alexandrescu 的优秀书籍),我认为编译时代码生成可能是解决方案。
但是,在将设计实现到库中之前,我需要对其进行测试。问题是关于测试此新功能效率的最佳方法。
显然我需要打开优化,因为没有这个 g++(可能还有其他编译器)会在目标代码中保留一些不必要的操作。我还需要大量使用基准测试中的新特性,因为 1e-3 秒的 delta 可以决定设计的好坏(这个特性在实际程序中会被调用百万次)。
问题是 g++ 在优化时有时“太聪明了”,如果它认为计算的结果从未被使用过,它可以删除整个循环。在查看输出汇编代码时,我已经看到过一次。
如果我向标准输出添加一些打印,编译器将被迫在循环中进行计算,但我可能主要对 iostream 实现进行基准测试。
那么如何对从库中提取的小特征进行正确的基准测试呢?相关问题:在一个小单元上进行这种体外测试是正确的方法还是我需要整个背景?
感谢您的建议!
似乎有几种策略,从允许微调的编译器特定选项到更通用的解决方案,这些解决方案应该适用于每个编译器,如volatile
or extern
。
我想我会尝试所有这些。非常感谢您的所有回答!