添加测试服务
0 码力 | 1 页 | 128.00 B | 5 月前3《深入浅出MFC》2/e
所生对象」的指针,所调用的vfunc2 就是Class2::vfunc2。 动态绑定机制,在执行时期,根据虚拟函数表,做出了正确的选择。 我们解开了第二道神秘。 口说无凭,何不看点实际。观其地址,物焉C哉,下面是一个测试程序: 80 #0025 public: #0026 int m_data1; #0027 int m_data4; #0028 void func2() { } #0029 virtual ((CDocument)mydoc).func(); #0043 } 前三个测试都符合我们对虚拟函数的期望:既然衍生类别已经改写了虚拟函数Serialize, 那么理当调用衍生类别之Serialize 函数。这种行为模式非常频繁地出现在application framework 身上。后续当我追踪MFC 源代码时,遇此情况会再次提醒你。 第四项测试结果则有点出乎意料之外。你知道,衍生对象通常都比基础对象大(我是指 CWnd 1 CCmdTarget pMyView received a WM_COMMAND, routing path and call stack: AfxWndProc() Frame8 测试四种情况:分别从frame 对象和view 对象中推动消息,消息分一般 Windows 消息和WM_COMMAND 两种: Frame8 的命令列编译联结动作是(环境变量必须先设定好,请参考第4章的「安装与设0 码力 | 1009 页 | 11.08 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming
无分支编程 Branchless Programming by 彭于斌( @archibate ) 两种代码写法:分支 vs 三目运算符 两种使用方式:排序 vs 不排序 测试结果(均为 gcc -O3 ) 测试结果可视化 图表比较:分支 vs 无分支 分支 无分支 0 0.01 0.02 0.03 耗时(越低越好) 乱序 有序 • 传统的分支方法实现的 uppercase 255) 不同写法的性能测试 • ifelse_clamp 带 if-else 分支的原始版本。 • bailan_clamp 用摆烂的态度坐等编译器优化。 • addmul_clamp 用“妙用加减乘”的方法优化。 • 我们照常编写了测试用例,禁止内联优化,同样 生成 10^7 个随机数( -512 到 512 区间)。 • 为什么采用需要三个分支的 clamp 做测试? • 优化级别在 if-else ,编译器往往会自动检测到可以优化,帮你 应用“妙用加减乘”了,无法体现手动优化的意义。 不同写法的性能测试 • 我们照常编写了测试用例,禁止内联优化,同样生成 10^7 个随机数( -512 到 512 区间)。 • 至于为什么采用需要三个分支的 clamp 做测试? • 优化级别在 -O1 以上时,对于只有两个分支的 if- else ,编译器往往会自动检测到可以优化,帮你应用0 码力 | 47 页 | 8.45 MB | 1 年前3Hello 算法 1.0.0b1 C++版
写在前面 hello‑algo.com 4 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注释、内容 注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.3. 在动画图解中高效学习 视频和图片相比于文字的信息密度和结构化程度更高,更容易理解。在本书中,知识重难点会主要以动画、图 容(一般在图的上方)对齐到 图中内容,综合来理解。 Figure 0‑3. 动画图解示例 0.2.4. 在代码实践中加深理解 本书的配套代码托管在GitHub 仓库,源代码包含详细注释,配有测试样例,可以直接运行。 ‧ 若学习时间紧张,建议至少将所有代码通读并运行一遍。 ‧ 若时间允许,强烈建议对照着代码自己敲一遍。相比于读代码,写代码的过程往往能带来新的收获。 0. 写在前面 hello‑algo 析,以及优化算法设计。 2.1.2. 效率评估方法 实际测试 假设我们现在有算法 A 和 算法 B ,都能够解决同一问题,现在需要对比两个算法之间的效率。我们能够想到 的最直接的方式,就是找一台计算机,把两个算法都完整跑一遍,并监控记录运行时间和内存占用情况。这种 评估方式能够反映真实情况,但是也存在很大的硬伤。 难以排除测试环境的干扰因素。硬件配置会影响到算法的性能表现。例如,在某台计算机中,算法0 码力 | 187 页 | 14.71 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化
因此带宽是 31198 MB/s 。 • 和理论带宽 42672 MB/s 相差不多,符合我的预期 。 第 2 章:缓存与局域性 针对不同数据量大小的带宽测试 • 我们试试看 a 不同的大小,对带宽有什么影响。 针对不同数据量大小的带宽测试(续) • 可见数据量较小时,实际带宽甚至超过了 理论带宽极限 42672 MB/s ! • 而数据量足够大时, 才回落到正常的带宽 。 • 这是为什么? 的 a[i] 写回主内存。 • 这种代码在主内存看来, CPU 做的事情相当于:读 + 写,从而 每个元素只需要访问两遍内存。对这种完全 mem-bound 的程 序而言就是加速了 2 倍。 测试结果 可见,能否很好的利用缓存,和程序访问内存的时间局域性有关。 案例:一维 jacobi 迭代 • 一些物理仿真中,常用到这种形式的迭代法: • for (i=0...n) b[i] = a[i 就没问题,因为他们是静态大小,编译器可 以检测到并自动扁平化,转换成乘法和加法来计算地址。 今日乳 Ja (1/1) 有一种病 ~ 叫 JavaBean~ 为什么二级指针是低效的存储和索引方式 随机访问性能测试 内存分配性能测试 二维数组:行主序与列主序 • 实际上二维数组的扁平化分为两种方法,行主序与列主序。 • (以下符号约定: i 行号, j 列号; n 行数, m 列数) • C/C++ 编译器把静态数组0 码力 | 147 页 | 18.88 MB | 1 年前3Hello 算法 1.0.0b2 C++版
写在前面 hello‑algo.com 4 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注释、内容 注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.3. 在动画图解中高效学习 视频和图片相比于文字的信息密度和结构化程度更高,更容易理解。在本书中,知识重难点会主要以动画、图 容(一般在图的上方)对齐到 图中内容,综合来理解。 Figure 0‑3. 动画图解示例 0.2.4. 在代码实践中加深理解 本书的配套代码托管在GitHub 仓库,源代码包含详细注释,配有测试样例,可以直接运行。 ‧ 若学习时间紧张,建议至少将所有代码通读并运行一遍。 ‧ 若时间允许,强烈建议对照着代码自己敲一遍。相比于读代码,写代码的过程往往能带来新的收获。 0. 写在前面 hello‑algo 析,以及优化算法设计。 2.1.2. 效率评估方法 实际测试 假设我们现在有算法 A 和 算法 B ,都能够解决同一问题,现在需要对比两个算法之间的效率。我们能够想到 的最直接的方式,就是找一台计算机,把两个算法都完整跑一遍,并监控记录运行时间和内存占用情况。这种 评估方式能够反映真实情况,但是也存在很大的硬伤。 难以排除测试环境的干扰因素。硬件配置会影响到算法的性能表现。例如,在某台计算机中,算法0 码力 | 197 页 | 15.72 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅
可见,并行后虽然降低了时间复杂度,但是以提升工作复杂度为代价! 更多细节,敬请期待 GPU 专题,我们会以 CUDA 为例详细探讨两全方案。 封装好了: parallel_scan 第 3 章:性能测试 案例: map 与 reduce 的组合 测试所花费时间: tbb::tick_count::now() 并行和串行的速度比较 如何评价 • 公式:加速比 = 串行用时 ÷ 并行用时 • 理想加速比应该是核心的数量。 ,需要做大量数学运算,因此瓶颈在 ALU 。 • 这里卖个关子,欲知后事如何,请待下集揭晓! 更专业的性能测试框架: Google benchmark • 手动计算时间差有点太硬核了,而且只运 行一次的结果可能不准确,最好是多次运 行取平均值才行。 • 因此可以利用谷歌提供的这个框架。 • 只需将你要测试的代码放在他的 • for (auto _: bm) • 里面即可。他会自动决定要重复多少次, 保证结果是准确的,同时不浪费太多时间 。 运行结果 刚才的 BENCHMARK_MAIN 自动生成了一个 main 函数 ,从而生成一个可执行文件供你运行。运行后会得到测试 的结果打印在终端上。 命令行参数 他还接受一些命令行参数来控制测试的输出格式为 csv 等等,你可以调用 --help 查看更多用法。 CMake 中使用: find_package CMake 中使用:作为子模块 这个什么“勾勾”公司非要默认开启0 码力 | 116 页 | 15.85 MB | 1 年前3Hello 算法 1.0.0b4 C++版
为准,例如使用 None 来表示“空”。 ‧ 本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2. 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,因此更易于理解。在本书中,重点和难点知识 综合两者来理解内容。 Figure 0‑2. 动画图解示例 0. 前言 hello‑algo.com 4 0.2.3. 在代码实践中加深理解 本书的配套代码托管在GitHub 仓库,源代码包含详细注释,并附有测试样例,可直接运行。 如果学习时间有限,建议你至少通读并运行所有代码。如果时间充裕,建议参照代码自行敲一遍。与仅阅读 代码相比,编写代码的过程往往能带来更多收获。 Figure 0‑3. 运行代码示例 析,从而指导算法设计与优化过程。 2.1.2. 效率评估方法 实际测试 假设我们现在有算法 A 和算法 B,它们都能解决同一问题,现在需要对比这两个算法的效率。我们最直接的 方法就是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够 反映真实情况,但也存在较大局限性。 难以排除测试环境的干扰因素。硬件配置会影响算法的性能表现。例如,在某台计算机中,算法0 码力 | 343 页 | 27.39 MB | 1 年前3面向亿行 C/C++ 代码的静态分析系统设计及实践-肖枭
合作创办源伞科技,致力于推动静态 分析技术在企业中的应用 目录 代码质量管理是个大问题 静态分析+代码评审的实践 学习和强调,红线和惩罚,100%的测试 覆盖率,和事后复盘并不够 有经验的程序员也会犯错 对代码提要求很难监督落实 测试更多是验证功能,很难检测编码缺陷 代码的快速变化使质量更难管 生产质量是责任 靠运维和事后复盘善后够吗? 静态分析工具:半智能的代码分析机器人 Bug! No Thx! DevOps: 代码质量责任应该左移 设计 代码 开发 代码 评审 入库 测试 发布 1. 非研发人员主导,沟通成本高,推动修复周期长 2. 很难形成标准推动研发实施 3. 形成技术债,偿债成本高 1. 代码签入前,研发人员有义务修复问题 2. 测试人员早期加入,更懂项目研发的情况,沟通成本低,加快上线 3. 能逐步形成好的编码规范和最佳实践 检查代码风格问题挺准,但是 挑战:超大规模代码仓库 项目平均40分钟单机编译时间 项目平均编译代码量超百万行 编译的价值 C/C++代码逻辑受编 译参数深度控制 源代码索引和统计 提升开源静态分析工 具分析质量 提高分析质量 测试项目 glog (谷歌的日志项目), 17个源文件。 cppcheck不带编译分析: 111个分析报告 cppcheck带编译分析: 280个分析报告 111 280 0 500 码力 | 39 页 | 6.88 MB | 1 年前3Hello 算法 1.1.0 C++ 版
本书部分放弃了编程语言的注释规范,以换取更加紧凑的内容排版。注释主要分为三种类型:标题注 释、内容注释、多行注释。 第 0 章 前言 hello‑algo.com 5 /* 标题注释,用于标注函数、类、测试样例等 */ // 内容注释,用于详解代码 /** * 多行 * 注释 */ 0.2.2 在动画图解中高效学习 相较于文字,视频和图片具有更高的信息密度和结构化程度,更易于理解。在本书中,重点和难点知识将主 所示的动画图解,请以图为主、以文字为辅,综合两者 来理解内容。 图 0‑2 动画图解示例 0.2.3 在代码实践中加深理解 本书的配套代码托管在 GitHub 仓库。如图 0‑3 所示,源代码附有测试样例,可一键运行。 如果时间允许,建议你参照代码自行敲一遍。如果学习时间有限,请至少通读并运行所有代码。 与阅读代码相比,编写代码的过程往往能带来更多收获。动手学,才是真的学。 第 0 章 前言 计与优化过程。 效率评估方法主要分为两种:实际测试、理论估算。 2.1.1 实际测试 假设我们现在有算法 A 和算法 B ,它们都能解决同一问题,现在需要对比这两个算法的效率。最直接的方法 是找一台计算机,运行这两个算法,并监控记录它们的运行时间和内存占用情况。这种评估方式能够反映真 实情况,但也存在较大的局限性。 一方面,难以排除测试环境的干扰因素。硬件配置会影响算法的性能。比如在某台计算机中,算法0 码力 | 379 页 | 18.47 MB | 1 年前3
共 17 条
- 1
- 2