C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器由浅入深学习 map 容器 by 彭于斌( @archibate ) 我负责监督你鞋习 ! 我负责监督你鞋习 ! 本期看点: 用方括号 [ ] 取出 map 元素居然是错误的! 能不能在遍历的同时删除元素?安全吗? emplace , emplace_hint , try_emplace 的区别? 课程安排 1. vector 容器初体验 & 迭代器入门 (BV1qF411T7sd) 2 set 容器 & 迭代器分类 (BV1m34y157wb) 3. string , string_view , const char * 的爱恨纠葛 (BV1ja411M7Di) 4. 万能的 map 容器全家桶及其妙用举例 ( 本期 ) 5. 函子 functor 与 lambda 表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 第一章:读取与写入 我负责监督你鞋习 ! 我负责监督你鞋习 ! map 查找元素的两个接口 • map 提供了两个查找元素的接口,一曰 [] ,二曰 at 。 • 那么他们两个又有什么区别呢?很多新手都分不清他俩,可能只认识 [] 。 读取 map 元素 • mapm; • 读取 map 中指定键值的元素有两种方法。 • val = m[“key”]; 0 码力 | 90 页 | 8.76 MB | 1 年前3
C++23: An Overview of Almost All New and Updated FeaturesStandard Library String Formatting Improvements Standard Library Modules std::flat_(multi)map / std::flat_(multi)set std::mdspan std::generator basic_string(_view)::contains() Construct Standard Library String Formatting Improvements Standard Library Modules std::flat_(multi)map / std::flat_(multi)set std::mdspan std::generator basic_string(_view)::contains() Construct Standard Library String Formatting Improvements Standard Library Modules std::flat_(multi)map / std::flat_(multi)set std::mdspan std::generator basic_string(_view)::contains() Construct0 码力 | 105 页 | 759.96 KB | 6 月前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 CFD 仿真、深度学习编程人 员 第 0 章:稀疏矩阵 稠密数组存储矩阵 用 foreach 包装一下枚举的过程 改用 map 来存储 分离 read/write/create 三种访问模式 foreach 直接给出当前坐标指向的值 改用 unordered_map 来存储 unordered_map unordered_map 手动 read(i, j) 也一样速度 索性把坐标和值打包成 tuple ,存储在 vector 按行压缩( Compressed Row Storage ) http://www.netlib.org/linalg/html_templates/node91.html 按行压缩( Compressed Row Storage ) http://www.netlib bit 用 map 来存储 读取:如果不存在,则读到 0 写入:如果不存在,则创建该表项 用 unordered_map 来存储 map 基于红黑树,会按照键值排序,需要键值具有 operator< 重载,复杂度 O(logn) C++11 新增的 unordered_map 基于哈希表,不保证顺序但更高效,需要键值能被哈希,复杂度 O(1) 用 unordered_map 按 16x160 码力 | 102 页 | 9.50 MB | 1 年前3
绕过conntrack,使用eBPF增强 IPVS优化K8s网络性能ingress Tc egress Hit eBPF map? Does SNAT nic nic Y N • How IPVS talks with eBPF program? • eBPF map id is passed to IPVS module • Ip_vs_new_conn() inserts eBPF map • Key: (protocol, cip:cport Value: (protocol, lip:lport, rsip:rsport) • Ip_vs_conn_unlink() deletes entries in eBPF map How eBPF does SNAT eBPF map IPVS eBPF SNAT add del refer • V.S service in pure eBPF • Reuse the IPVS’s functionality functionality and maturity • Many scheduling algorithms • Reuse IPVS timer to reclaim eBPF map • More efficient and secure • V.S Taobao IPVS SNAT patch • Bypass conntrack/iptables • Less modification0 码力 | 24 页 | 1.90 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming动返回缺省值的效果。 对于自变量不连续的情况:查表法需要从数组变成 map • 不过把 lut 作为数组的方法只适用于自变量 x 连 续变化的情况,如果不连续,则只好采用 map 查表了(相当于 Python 的字典)。 • 不过 map 的查找开销更大,复杂度为 O(logn) ,比线性数组的 O(1) 要坏一点点。 • 所以采用 map 也可能导致反而比暴力 if-else 更 低效,也可能高效,要测试才知道。 低效,也可能高效,要测试才知道。 • 抛开性能不谈,从可读性和可维护性上来 说, map 是完胜的,不再需要重复打字 } else if (...) { 了,因此我仍十分推荐用 map 。 不得不分支时可以采取的优化手段: likely 和 unlikely 除了 if-else 分支之外:函数指针也是一种分支,也有预判的开销 • 函数调用相当于无条件跳转指令: jmp label 或者说 call0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 extern std::map<...> functab; • 慢着,这样会有一定的几率出现 segfault ! • 就是说,如果 functab 所在的 main.o 文 件在链接中是处于 cat.o 和 dog.o 后面 的话,那么 cat.o 和 dog.o 的静态初始 化就会先被调用,这时候 functab 的 map 还没有初始化( map 的构造函数也 是静态初始化!)从而会调用未初始化的 是静态初始化!)从而会调用未初始化的 map 对象导致奔溃。 函数体内的静态初始化 • 为了寻找思路,我们把眼光挪开全局的 static 变量,来看看函数的 static 变量吧 ! • 众所周知,函数体内声明为 static 的变量 即使函数退出后依然存在。 • 实际上函数的 static 变量也可以指定初始 化表达式,这个表达式会在第一次进入函 数时执行。注意:是第一次进入的时候执0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器(BV1qF411T7sd) 2. 你所不知道的 set 容器 & 迭代器分类 ( 本期 ) 3. string , string_view , const char * 的爱恨纠葛 4. 万能的 map 容器全家桶及其妙用举例 5. 函子 functor 与 lambda 表达式知多少 6. 通过实战案例来学习 STL 算法库 7. C++ 标准输入输出流 & 字符串格式化 8. traits 技术,用户自定义迭代器与算法 就相当于让相等条件变成了 a[0] == b[0] 。也就是说只要第 一个字符相等就视为字符串相 等,所以 “ arch” 和 “ any” 会 被视为相等的元素,从而被 set 给去重了! • 扩展知识:其实, map无非就是个只比较 K 无视 T 的 set > ,顺手还 加了一些方便的函数,比如 [] 和 at 。 set 和 vector 迭代器的共同点 • 上节课讲了迭代器: output_iterator 前向迭代器 * , != , == , ++ forward_list forward_iterator 双向迭代器 * , != , == , ++ , -- set , map , list bidirectional_iterator 随机访问迭代器 * , != , == , ++ , -- , + , - , += , -= , [] vector , array 0 码力 | 83 页 | 10.23 MB | 1 年前3
Автоматизация управления ClickHouse-кластерами в KubernetesReplica Service Replica Service User Config Map Common Config Map Stateful Set Pod Persistent Volume Claim Persistent Volume Per-replica Config Map Altinity ClickHouse operator – использование0 码力 | 44 页 | 2.24 MB | 1 年前3
C++20: An (Almost) Complete OverviewC++2052 Spaceship Operator <=> Standard Library types include support for <=> vector, string, map, set, sub_match, … Example:53 Range-based for Loop Initializer Initializers for switch statements "Hello world!" }; bool b { str.starts_with("Hello") }; contains() for associative containers: std::map myMap { std::pair {1, "one"s}, {2, "two"s}, {3, "three"s} }; bool result { myMap.contains(2) }; 0 码力 | 85 页 | 512.18 KB | 6 月前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化结论:尽量避免代码复杂化,避免使用会造 成 new/delete 的容器。 简单的代码,比什么优化手段都强。 造成 new/delete 的容器:我是说,内存分配在堆上的容器 • 存储在堆上(妨碍优化): • vector, map, set, string, function, any • unique_ptr, shared_ptr, weak_ptr • 存储在栈上(利于优化): • array, bitset, glm::vec :强迫编译器在编译期求值 结论:如果发现编译器放弃了自动优化,可以 用 constexpr 函数迫使编译器进行常量折叠! 不过, constexpr 函数中无法使用非 constexpr 的容器: vector, map, set, string 等 …… constexpr :强迫编译器在编译期求值(续) 发现:会让编译变得很慢,因为这 50000 次迭代是在编译期进行的。 第 2 章:内联 调用外部函数:0 码力 | 108 页 | 9.47 MB | 1 年前3
共 20 条
- 1
- 2













