c++性能测试工具:google benchmark进阶(一) 这是c++性能测试工具教程的第四篇文章,从本篇开始我将逐步介绍一些性能测试的高级技巧。 前三篇教程可以看这里: c++性能测试工具:google benchmark入门(一) c++性能测试工具:google benchmark入门(二) c++性能测试工具:计算算法的时间复杂度 本文将会介绍如何使用模板以及参数生成器来批量生成测试用例,简化繁琐的性能测试代码。 测试对象 这次测试的对象是标准库的vector,我们将会在vs2019 16.10和Linux + GCC 11.1上进行测试。为了代码写着方便,我还会启用c++17支持。 这次的疑问来自于《A Tour of C++》这本书,最近在重新翻阅本书的时候发现书里第九章给出了一个很有意思的建议:尽量少用reserve方法。 我们都知道reserve会提前分配足够大的内存来容纳素,这样在push_back时可以减少内存分配和素移动的次数,从而提高性能。所以习惯上如果我们知道vector中存储素的大致数量,就会使用reserve提前进行内存分配,这是典型的“空间换时间”。 而书中给出的理由仅仅是说vector的内存分配器性能已经很高,预分配往往是多此一举,收效甚微。事实到底如何呢,性能问题光靠脑补是不能定位的,所以我们用实验结果说话。 使用模板函数生成测试 测试用例的设计很简单,我们定义普通vector和reserve过的vector,然后分别对其添加一定数量的素(逐步从少到多)测试性能。 同时vector本身是泛型容器,所以为了测试的全面性我们需要测试两至三种类型参数。 如果针对每一种情况写测试函数,显然违反了DRY原则,因为除了vector的类型参数不同,其他代码几乎是完全一样的。 对于上面的需求,就需要模板测试函数登场了: 非常的简单,我们通过控制插入的素个数;则负责控制是否预分配内存,通过可以生成reserve和不进行任何操作的两种代码(如果不熟悉c++17的if constexpr,推荐花两分钟看看这里)。 然后我们像往常一样定义一个测试用例: 可是等我们编译的时候却报错了! 原因是这样的,在编译器处理宏的时候实际上不会考虑c++语法,所以分割模板参数的逗号被识别成了分割宏参数的逗号,因此在宏处理器的眼里我们像是传了两个参数。这也说明了是处理不了模板的。 不过别担心,Google早就想到这种情况了,所以提供了宏,我们只需要把模板名字和需要的类型参数依次传给宏即可: 现在就可以正常编译运行了: 




2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/26136.html