Hidden Overhead of a Function APIperformance, we typically think about the function logic. We’ll see that a well designed function API can have an even larger impact.How will we compare performance? ● Benchmarks at this low level are advance(RandIter& iter, Diff n, random_access_iterator_tag) { iter += n; } ● Access token to make some API available only inside the library (like the default “package private” access modifier in Java) Empty0 码力 | 158 页 | 2.46 MB | 6 月前3
GraphBLAS: Building a C++ Matrix API for Graph Algorithmsthe important data structures and concepts? Prior work in the GraphBLAS community, C API Overview of our draft C++ API How might this interoperate with standard C++, graph library proposal? 4[DISTRIBUTION the important data structures and concepts? Prior work in the GraphBLAS community, C API Overview of our draft C++ API How might this interoperate with standard C++, graph library proposal? 5[DISTRIBUTION the important data structures and concepts? Prior work in the GraphBLAS community, C API Overview of our draft C++ API How might this interoperate with standard C++, graph library proposal? 6[DISTRIBUTION0 码力 | 172 页 | 7.40 MB | 6 月前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器Python 对比 • Python 中 val = m[“key”] 读取元素,找不到键值会出错,调试时更早发现错误。 • C++ 中 val = m[“key”] 读取元素,找不到键值不会出错而是默默创建,还初始化为 0 。 • C++ 中 val = m.at(“key”) 读取元素,找不到键值会出错,调试时更早发现错误。 • 所以 C++ 中读取元素,应该用 at() 才对, at() 在读取时和多数语言的 行为一致。 • 很多初学者都会错误使用 [] 读取元素,他以为找不到键值会报错,结果他不报错,默默创 建了个 0 返回给你,导致实际报错的地方滞后,没发现错误在 map 的读取这里,严重影 响他的调试效率( javascript 的 undefined 直呼内行)。 写入 map 元素 • mapm; • 写入 map 中指定键值的元素有两种方法。 • m[“key”] 小彭老师说“我在拉答辩。”那么同学认为这个答辩指的是答辩(物理),小彭老师在上厕所。 而不会认为小彭老师在制作三体动画。 • 所以这位同学是人类思维,相当于 Python 的精分 API 。而如果另一个同学是硬核的计算 机思维,相当于 C++ 的一视同仁 API ,他会以为小彭老师真的在吃答辩。 • 这是通常来说,不过万一小彭老师真的这么重口味在吃答辩呢?要怎么传达这个信息? C++ 一视同仁的接口就能处理这种罕见的情况,不过 0 码力 | 90 页 | 8.76 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程用一个 debug 参数控制是否输出调试信 息。 • 但是这样 debug 是运行时判断,这样即 使是 debug 为 false 也会浪费 CPU 时 间。 模板的应用:编译期优化案例(续) • 因此可以把 debug 改成模板参数,这样 就是编译期常量。编译器会生成两份函数 sumto和 sumto 。前者保 留了调试用的打印语句,后者则完全为性 能优化而可以去掉打印语句。 或者 int(*)(int) 即可。 • 函数指针效率更高一些,但是 [] 就没办法 捕获局部变量了(全局变量还是可以的) 。 • 最大的好处是可以伺候一些只接受函数指 针的 C 语言的 API 比如 pthread 和 atexit 。 lambda + 模板:双倍快乐 • 可以将 lambda 表达式的参数声明为 auto ,声明为 auto 的参数会自动根据调 用者给的参数推导类型,基本上和 0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vector>= a.size() 则会抛出异常 std::out_of_range 让程序提前终止(或者被 try-catch 捕获),配合任意一款调试器,就可 以很快速地定位到出错点。 • 不过 at 需要额外检测下标是否越界,虽然更安 全方便调试,但和 [] 相比有一定性能损失。 • int &at(size_t i); • int const &at(size_t i) const; 返回的数组长度一起使用(见上一课《 C 语言指针》中提到,连续的动态数组只需要 知道首地址和数组长度即可完全确定)。 • 用他来获取一个 C 语言原始指针 int * , 很方便用于调用 C 语言的函数和 API 等 ,同时还能享受到 vector 容器 RAII 的安 全性。 • ~vector() noexcept; vector 容器: RAII 避免内存泄露 • 如果用 new/delete0 码力 | 90 页 | 4.93 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南放到 src 目录下 。 第 2 章:项目配置变量 CMAKE_BUILD_TYPE 构建的类型,调试模式还是发布模式 • CMAKE_BUILD_TYPE 是 CMake 中一个特殊的变量,用于控制构建类型,他的值可以 是: • Debug 调试模式,完全不优化,生成调试信息,方便调试程序 • Release 发布模式,优化程度最高,性能最佳,但是编译比 Debug 慢 • MinSizeRel MinSizeRel 最小体积发布,生成的文件比 Release 更小,不完全优化,减少二进制体积 • RelWithDebInfo 带调试信息发布,生成的文件比 Release 更大,因为带有调试的符号信 息 • 默认情况下 CMAKE_BUILD_TYPE 为空字符串,这时相当于 Debug 。 各种构建模式在编译器选项上的区别 • 在 Release 模式下,追求的是程序的最佳性能表现,在此情况下,编译器会对程序做最大 模式下,追求的是程序的最佳性能表现,在此情况下,编译器会对程序做最大 的代码优化以达到最快运行速度。另一方面,由于代码优化后不与源代码一致,此模式下 一般会丢失大量的调试信息。 1. Debug: `-O0 -g` 2. Release: `-O3 -DNDEBUG` 3. MinSizeRel: `-Os -DNDEBUG` 4. RelWithDebInfo: `-O2 -g -DNDEBUG` • 此外,注意定义了0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串个字符。 • 区别在于 at 如果遇到 i 越界的情况,也就是检测到 i ≥ s.size() 时,会抛出 std::out_of_range 异常终止程序。使用 gdb 等调试 器就可以在出这个异常的时候暂停,帮你调试错误 ( BV1kP4y1K7Eo )。也可以从外部函数 catch 住这个异常(以 后再讲)。 • 而 [] 则不会抛出异常,他只是简单地给字符串的首地址指针和 i 做个 + 和 += 比 append 更直观,而且只要配合 string_view ,性能上就没有区别了,为什么不用呢? • 先把程序写出来,结果跑对了,再来考虑什么优化的问题。 • 直观的程序更容易调试,而 + 是非常直观的。——沃兹基硕德 • 小彭老师锐评:跑之前先学会走,反对心理作用优化、性能强迫症 。 • 围棋术语说:本手,妙手,俗手。 • 可能你以为自己这一步是妙手,其实是擦粑粑的手。 string_view 源码大赏 标准库 string 源码解析 第 8 章 string 的本质是 basic_string string 的本质是 basic_string • 所以在调试的时候经常会看到 string 被 c++filt 解析为 basic_string, allocator > 。 • 因为 std::string 0 码力 | 162 页 | 40.20 MB | 1 年前3
Hello 算法 1.1.0 C++ 版克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 codes 文件夹内 找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内 容。 图 0‑5 代码块与对应的源代码文件 除了本地运行代码,网页版还支持 Python 代码的可视化运行(基于 pythontutor 实现)。如图 0‑6 所示,你 Unicode 字符。这是一个不得已为之的无奈之举。一方面,包含代理对的字符串中,一个字符可能占用 2 字节或 4 字 节,从而丧失了等长编码的优势。另一方面,处理代理对需要额外增加代码,这提高了编程的复杂性和调试 难度。 出于以上原因,部分编程语言提出了一些不同的编码方案。 ‧ Python 中的 str 使用 Unicode 编码,并采用一种灵活的字符串表示,存储的字符长度取决于字符串 中最大的 Unicode 一个典型案例。 为了保证正确性,我们应该对贪心策略进行严谨的数学证明,通常需要用到反证法或数学归纳法。 然而,正确性证明也很可能不是一件易事。如若没有头绪,我们通常会选择面向测试用例进行代码调试,一 步步修改与验证贪心策略。 15.1.4 贪心算法典型例题 贪心算法常常应用在满足贪心选择性质和最优子结构的优化问题中,以下列举了一些典型的贪心算法问题。 ‧ 硬币找零问题:在某些硬币组合下,贪心算法总是可以得到最优解。0 码力 | 379 页 | 18.47 MB | 1 年前3
Hello 算法 1.0.0 C++版克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 codes 文件夹内 找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内 容。 图 0‑5 代码块与对应的源代码文件 除了本地运行代码,网页版还支持 Python 代码的可视化运行(基于 pythontutor 实现)。如图 0‑6 所示,你 Unicode 字符。这是一个不得已为之的无奈之举。一方面,包含代理对的字符串中,一个字符可能占用 2 字节或 4 字 节,从而丧失了等长编码的优势。另一方面,处理代理对需要额外增加代码,这提高了编程的复杂性和调试 难度。 出于以上原因,部分编程语言提出了一些不同的编码方案。 ‧ Python 中的 str 使用 Unicode 编码,并采用一种灵活的字符串表示,存储的字符长度取决于字符串 中最大的 Unicode 一个典型案例。 为了保证正确性,我们应该对贪心策略进行严谨的数学证明,通常需要用到反证法或数学归纳法。 然而,正确性证明也很可能不是一件易事。如若没有头绪,我们通常会选择面向测试用例进行代码调试,一 步步修改与验证贪心策略。 15.1.4 贪心算法典型例题 贪心算法常常应用在满足贪心选择性质和最优子结构的优化问题中,以下列举了一些典型的贪心算法问题。 ‧ 硬币找零问题:在某些硬币组合下,贪心算法总是可以得到最优解。0 码力 | 378 页 | 17.59 MB | 1 年前3
Hello 算法 1.2.0 简体中文 C++ 版克隆仓库与下载代码 第三步:运行源代码。如图 0‑5 所示,对于顶部标有文件名称的代码块,我们可以在仓库的 codes 文件夹内 找到对应的源代码文件。源代码文件可一键运行,将帮助你节省不必要的调试时间,让你能够专注于学习内 容。 图 0‑5 代码块与对应的源代码文件 除了本地运行代码,网页版还支持 Python 代码的可视化运行(基于 pythontutor 实现)。如图 0‑6 所示,你 Unicode 字符。这是一个不得已为之的无奈之举。一方面,包含代理对的字符串中,一个字符可能占用 2 字节或 4 字 节,从而丧失了等长编码的优势。另一方面,处理代理对需要额外增加代码,这提高了编程的复杂性和调试 难度。 出于以上原因,部分编程语言提出了一些不同的编码方案。 ‧ Python 中的 str 使用 Unicode 编码,并采用一种灵活的字符串表示,存储的字符长度取决于字符串 中最大的 Unicode 一个典型案例。 为了保证正确性,我们应该对贪心策略进行严谨的数学证明,通常需要用到反证法或数学归纳法。 然而,正确性证明也很可能不是一件易事。如若没有头绪,我们通常会选择面向测试用例进行代码调试,一 步步修改与验证贪心策略。 15.1.4 贪心算法典型例题 贪心算法常常应用在满足贪心选择性质和最优子结构的优化问题中,以下列举了一些典型的贪心算法问题。 ‧ 硬币找零问题:在某些硬币组合下,贪心算法总是可以得到最优解。0 码力 | 379 页 | 18.48 MB | 10 月前3
共 196 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20













