JVM 内存模型JVM 内存模型 Heap Method Area Runtime Constant Pool Thread Thread Thread PC Register JVM Stack Native Method Stack PC Register JVM Stack Native Method Stack PC Register JVM Stack Native Method0 码力 | 1 页 | 48.42 KB | 1 年前3
RustBelt - Rust 的形式化语义模型第三届中国 Rust 开发者大会 王俊吉 RustBelt - Rust 的形式化语义模型 Outline Background • RustBelt Project • Rust Types Overview Rust Semantics • Type System • The own Predict • Exclusive Ownership & Mutable Borrow0 码力 | 21 页 | 2.63 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 14 C++ 标准库系列课 - 你所不知道的 set 容器会自动给其中的 元素从小到大排序,而 vector 会保持插入时的顺序。 • 区别 2 : set 会把重复的元素 去除,只保留一个,即去重。 • 区别 3 : vector 中的元素在内 存中是连续的,可以高效地按 索引随机访问, set 则不行。 • 区别 4 : set 中的元素可以高 效地按值查找,而 vector 则 低效。 set 的排序: string 会按“字典序”来排 会按“字典序”来排 • set 会从小到大排序,对 int 来 说就是数值的大小比较。那么对 字符串类型 string 要怎么排序 呢? • 其实 string 类定义了运算符重 载 < ,他会按字典序比较两个 字符串。所谓字典序就是优先比 较两者第一个字符(按 ASCII 码比较),如果相等则继续比较 下一个,不相等则直接以这个比 较的结果返回。如果比到末尾都 相等且字符串长度一样,则视为 相等。 警告:千万别用 set做字符串集合。 这样只会按字符串指针的地址去判断相等, 而不是所指向字符串的内容。 set 的排序:自定义排序函数 • set 作为模板类,其实有两 个模板参数: set • 第一个 T 是容器内元素的类 型,例如 int 或 string 等。 • 第二个 CompT 定义了你想 要的比较函子, set 内部会 调用这个函数来决定怎么排 0 码力 | 83 页 | 10.23 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器的元素类型是…… • set::value_type 是 V 。 • map ::value_type 是 pair 。 • 这很合理,虽然只针对 K 排序,但实际上 K 和 V 是捆绑在一起的。 • pair 就是这样一个结构,前 K 后 V ,在内存中也是紧挨着。 k k k k k k k k k k k k v const_iterator 。 • 但是 map 只针对 K 进行排序, V 又不参与排序,完全可以随意改变。因此 C++ 之父 允许 map 的迭代器不 const ,而是让 pair 中的 K 单独加上 const 修饰, V 不加 const 。这样既能防止用户不小心修改了 K ,也能允许随意自由修改不参与排序的 V 。 k k k k k k k k k k k 是中根遍历,先左子节点,然后根节点,最后右子节点。 • 为什么是中根遍历?因为刚刚说了二叉排序树的规则是:左子节点<父节点<右子节点。 • 这刚好是中根遍历的顺序,左中右。所以迭代器的 ++ 方向刚好是 K 越来越大的方向。 • 结论:遍历时,总是会按 K 从小到大的顺序。 k k k k k k v v v v v v 小 大 第三章:二叉排序树 高效的查找离不开我 高效的查找离不开我 回顾 set 0 码力 | 90 页 | 8.76 MB | 1 年前3
Rust与算法 - 谢波在操作系统,数据库,各种框架和工具上应用范围 广 写作动机 当情况不明时,抱着一个纯粹的目标干事就行了,其他 的留给时间检验。不懂就学,技术写作更像一种共创, 要反复总结和修改 ( 费曼学习法 ) 。 写作本书给我的启示 基础、排序、查找、树、图 代码框、颜色、图片绘制均由 Latex 完成 可参考点 为什么 为什么讲这个话题? 为什么要讲数据结构和算法两部分? 算法相关知识 算法相关知识 • 抽象数据类型 • Option ? 链表 链接可能为空 多种迭代 Vec 借助链表 随机插入 插入新的 Vec Rust 实现算法 • 蒂姆排序 • 字典树 • 图 Rust 实现算 法 蒂姆排序 什么是蒂姆排序? 蒂姆排序 位运算 高低位排序区别处理 https://github.com/QMHTMY/RustBook/blob/main/publication/code/ch0 码力 | 28 页 | 3.52 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅ind 只有 0 和 1 ,应该大有优化空间) 第 8 章:分治与排序 斐波那契数列第 n 项 斐波那契数列第 n 项:并行 tbb::task_group 的封装: tbb::parallel_invoke 任务划分得够细时,转为串行,缓解调度负担( scheduling overhead ) 标准库提供的排序 快速排序 std::hash 用于从输入生成随机数,输入不变则结果不 变。 变。 随机枢轴的位置防止数据已经有序造成最坏的 O(n²) 。 并行快速排序 (和刚刚手写的快速排序)加速比: 2.05 倍 改进:数据足够小时,开始用标准库串行的排序 (和标准库串行的 std::sort )加速比: 4.59 倍 封装好了: tbb::parallel_sort (和标准库串行的 std::sort )加速比: 4.80 倍 重新认识改进的并行缩并 • 其实之前提到“改进后的并行缩并”,也是一0 码力 | 116 页 | 15.85 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming@archibate ) 两种代码写法:分支 vs 三目运算符 两种使用方式:排序 vs 不排序 测试结果(均为 gcc -O3 ) 测试结果可视化 图表比较:分支 vs 无分支 分支 无分支 0 0.01 0.02 0.03 耗时(越低越好) 乱序 有序 • 传统的分支方法实现的 uppercase ,对于 排序过的数据明显比乱序时高效。 • 无分支的方法对于乱序和有序的数据一样 无分支的方法对于乱序和有序的数据一样 高效,性能吊打了传统的分支方法。 • 对于传统分支的做法,为什么排序了的更 高效?既然无分支更高效,我要怎样优化 才能让我的程序变成无分支的呢?那就来 看本期性能优化专题课吧! 分支预测成败对性能的影响 排序为什么对有分支的版本影响那么大 为什么需要流水线 • 为了高效, CPU 的内部其实是一个流水 线 (pipeline) 。流水线的目的是能把原本 串行的一系列指令并行化。为了理解为什0 码力 | 47 页 | 8.45 MB | 1 年前3
谈谈MYSQL那点事不打开 ) 128M 查询缓存区的最大长度,按照当前需求,一 倍一倍增加,本选项比较重要 sort_buffer_size 512K 128M 每个线程的排序缓存大小,一般按照内存可 以设置为 2M 以上,推荐是 16M ,该选项对 排序 order by , group by 起作用 record_buffer 128K 64M 每个进行一个顺序扫描的线程为其扫描的每 张表分配这个大小的一个缓冲区,可以设置0 码力 | 38 页 | 2.04 MB | 1 年前3
Borsh 安全高效的二进制序列化整数采用低字节序( little endian) 存储 • 对于动态长度的集合,先用一个 u32 存储集合 size • 对于原本无序的集合(如 hashmap ),存储时使用 key 的字典序排序 Borsh 规范 let a: [u32; 5] = [1, 2, 3, 4, 5]; let a = vec![1, 2, 3, 4, 5]; let solar_distance = HashMap::from([0 码力 | 21 页 | 3.35 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型存储,一个 char 可以存储 8 个 bit 用 map 来存储 读取:如果不存在,则读到 0 写入:如果不存在,则创建该表项 用 unordered_map 来存储 map 基于红黑树,会按照键值排序,需要键值具有 operator< 重载,复杂度 O(logn) C++11 新增的 unordered_map 基于哈希表,不保证顺序但更高效,需要键值能被哈希,复杂度 O(1) 用 unordered_map0 码力 | 102 页 | 9.50 MB | 1 年前3
共 17 条
- 1
- 2













