现代 C++ 编程实战
吴咏炜
前 Intel 资深软件架构师
34199 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 51 讲
加餐 (1讲)
现代 C++ 编程实战
15
15
1.0x
00:00/00:00
登录|注册

33|性能测试的正确姿势:性能、时间和优化

执行顺序与性能
整数运算溢出
优化与未定义行为的关系
优化与程序员直觉的冲突
自动化测试与数据汇总
RAII机制
循环调用与时间测量
内存屏障与锁的使用
测试代码组织
时间戳计数器(TSC)的使用
C++11 时钟的选择
clock() 函数的局限性
时间测量精度与API设计
不同平台的时间测量函数
编译器特定的内存屏障指令
内存屏障的使用
全局变量的影响
全局变量与性能测试
volatile 关键字的使用
代码执行顺序调整
编译器优化导致的测试结果差异
memset 与手动循环的性能对比
编译器优化的检验
动态数据块大小的性能测试
优化示例
编译器优化的必要性
测试框架
通用测试方法
时间测量问题
内存屏障问题
编译器优化
意外的测试结果
参考资料
课后思考
优化问题
性能测试
性能测试的正确姿势:性能、时间和优化

该思维导图由 AI 生成,仅供参考

你好,我是吴咏炜。
在上一讲讲完后,原本计划是要聊一聊内存池的。不过,要说内存池的好坏,就得讨论性能,而之前并没有专门讲过性能测试这个话题。鉴于这个问题本身有一定的复杂性,我们还是先专门用一讲讨论一下性能测试的相关问题。

意外的测试结果

假设你想测试一下,memset 究竟有没有性能优势。于是,你写下了下面这样的测试代码:
#include <stdio.h>
#include <string.h>
#include <time.h>
int main()
{
constexpr int LOOPS = 10000000;
char buf[80];
clock_t t1;
clock_t t2;
t1 = clock();
for (int i = 0; i < LOOPS; ++i) {
memset(buf, 0, sizeof buf);
}
t2 = clock();
printf("%g\n", (t2 - t1) * 1.0 /
CLOCKS_PER_SEC);
t1 = clock();
for (int i = 0; i < LOOPS; ++i) {
for (size_t j = 0;
j < sizeof buf; ++j) {
buf[j] = 0;
}
}
t2 = clock();
printf("%g\n", (t2 - t1) * 1.0 /
CLOCKS_PER_SEC);
}
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了性能测试的复杂性和正确姿势,以及编译器优化对性能测试结果的影响。作者通过具体案例展示了在性能测试中可能出现的意外结果,并提出了解决方法。文章首先介绍了不同平台的时间测量函数的差异,并讨论了精度受 API 设计和函数实现影响的问题。作者还分享了通用的性能测试方法,以及一个小测试框架的使用。此外,文章还浅谈了优化的问题,指出编译器优化常常违背程序员的直觉,但在追求性能方面却表现出色。通过讨论优化和未定义行为以及优化和执行顺序的例子,读者能够更好地理解优化对代码和测试产生的影响,并能正确地测试代码的性能。整体而言,本文通过深入的技术讨论,为读者提供了关于性能测试的宝贵指导,使其能够更好地理解和应对性能测试中的复杂性和细节性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《现代 C++ 编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 禾桃
    “clock_gettime精度是0.0265微秒” 也就是26.5纳秒 请问,如果Clock_gettime返回值是到纳秒,两次取时间的差值如果是15纳秒(小于26.5纳秒),是不是意味着这个15纳秒其实手机不准确的,因为精度是26.5纳秒,远大于15纳秒。

    作者回复: 差值是15纳秒,那精度显然就是15纳秒了(如果稳定的话)。事实上,对于这个函数,精度就是它的耗时——表达能力已经足够高了。

    2022-04-23
  • 王旧业
    原来UB还有积极正向的作用,以前没考虑过这种
    2022-11-02归属地:陕西
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部