Rust分布式账务系统 - 胡宇
Raft 共识,等待 events 被多数节点保存 ○ 共识:基于 raft-rs 的可靠消息队 列 ○ 存储: Rocksdb with Rust 账户层: Auticuro 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ● 3. 处理被共识的 events ,更新状态机 账户层: Auticuro 分布式账务系统 1 2 3 4 ● 1. 接受转账请求,转换成 events ● 2. 将 events 送入 Raft 共识,等待 events 被多数节点保存 ● 3. 处理被共识的 events ,更新状态机 (账户表) ● 4. 回调完成请求 账户层: Auticuro 分布式账务系统 1 2 3 4 事务层: Marker 分布式账务系统0 码力 | 27 页 | 12.60 MB | 1 年前3谈谈MYSQL那点事
innodb_buffer_pool_size 32M 10G InnoDB 使用一个缓冲池来保存索引和原始数据 , 这里你设置越大 , 你在存取表里面数据时所需要的 磁盘 I/O 越少,一般是内存的一半,不超过 2G , 否则系统会崩溃,这个参数非常重要 innodb_additional_mem _pool_size 2M 512M InnoDB 用来保存 metadata 信息 , 如果内存是 16G ,最好本值超 1024M0 码力 | 38 页 | 2.04 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 06 TBB 开启的并行编程之旅
队列里取出数据,即“认领任务”。然后执行,执行 完毕后才去认领下一个任务,从而即使每个任务 工作量不一也能自动适应。 • 这种技术又称为线程池( thread pool ),避免了 线程需要保存上下文的开销。但是需要我们管理 一个任务队列,而且要是线程安全的队列。 struct Task { int x0, y0; int nx, ny; }; std::queue识到无法再追加新数据。这时他会重新 malloc 一段更大的连续内存,使得 capacity 变成 size 的两倍,并且把旧的数据移动过去,然后继续追 加数据。 • 这就导致前半段的元素的地址被改变,从而导致 之前保存的指针和迭代器失效。 reserve 预留足够的 capacity • 如果预先知道 size 最后会是 n ,则可以 调用 reserve(n) 预分配一段大小为 n 的 内存,从而 capacity 0 码力 | 116 页 | 15.85 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 13 C++ STL 容器全解之 vector
样,同样因为返回的是一个左值引用所以还可以继续 自增比如 ++++p 。 • p++ 会返回自增前的值 p ,但是执行完以后 p 却又 是 p + 1 了,非常迷惑) • 正因如此,后置自增需要先保存旧的迭代器,然后自 增自己,再返回旧迭代器,可能会比较低效。 • 在 C++ 中我推荐尽可能地多用前置自增 ++p 。 在运算符重载上,沙雕的 C++ 标准 委员会规定, operator++(int) 只往尾部插入元素。如果需要高效的头部插入,可以考虑用 deque 容器,他有高效的 push_front 函数替代。 • insert 在容量不足时,同样会造成重新分配以求扩容,会移 动其中所有元素,这时所有之前保存的迭代器都会失效。 vector 容器: insert 函数,插到指定的元素前方 • 如果要插入到一个特定位置,可以用迭代 器的加法来获取某一位置的迭代器。 • 例如 a.begin() +0 码力 | 90 页 | 4.93 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化
架构中的通用寄存器有: • eax, ecx, edx, ebx, esi, edi, esp, ebp • 其中 esp 是堆栈指针寄存器,和函数的调用与返回相关。 • 其中 eax 是用于保存返回值的寄存器。 通用寄存器: 64 位时代 • 64 位 x86 架构中的通用寄存器有: • rax, rcx, rdx, rbx, rsi, rdi, rsp, rbp, r8, r9, r100 码力 | 108 页 | 9.47 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器
v (假如非常大的话) 执行你这段代码 的栈空间 & & ( 建立引用 ) map 中的 堆空间 • 何况 structural-binding 捕获的引用比刚刚图示的还要优化。他只会保存一个指向 pair 类 型的指针,然后在你使用 k 和 v 时再去按偏移量访问里面的 first 和 second ,所以 k , v 两个变量的 structural-binding 引用其实是一个引用,只占一个指针的空间(0 码力 | 90 页 | 8.76 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南
动基于终端的可视化缓存编辑菜单。 • 在 Windows 则可以 cmake-gui -B build 来启动 图形界面编辑各个缓存选项。 • 当然,直接用编辑器打开 build/CMakeCache.txt 修改后保存也是可以的。 • CMakeCache.txt 用文本存储数据,就是可供用 户手动编辑,或是被第三方软件打开并解析的。 缓存变量到底该如何更新?暴力解决:删 build 大法 用万能的“删 build0 码力 | 166 页 | 6.54 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针
需要面对的是任意类型的数组。 • strlen(s) 的本质无非是从指针 s 开始,第 几个元素是 0 ,也就是字符串的长度了。 • 而字符串实际占据的内存比 strlen 的长度多 1 字节,因为要保存那个标记终点的 0 。 双引号的字符串常量,就是 0 结尾字符数组的简写 • 实际上 C 语言中形如 “ Hello” 这样的字 符串,相当于字符数组 {‘H’, ‘e’, ‘l’, ‘l’,0 码力 | 128 页 | 2.95 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程
各个板块。正如操作系统在多个 CPU 核心之间调度线程那样…… • 不过有一点不同, GPU 不会像 CPU 那样做时间片轮换——板块一旦被调度到了一个 SM 上,就会一直执行,直到他执行完退出,这样的好处是不存在保存和切换上下文(寄 存器,共享内存等)的开销,毕竟 GPU 的数据量比较大,禁不起这样切换来切换去…… • 一个 SM 可同时运行多个板块,这时多个板块共用同一块共享内存(每块分到的就少了) 。0 码力 | 142 页 | 13.52 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
这么方便,能不能让他不要直接输出到控制台,而是把结果存到一个字 符串呢?这正是字符串流 stringstream 的作用。 • 和 cout 完全一样,同样的 << 和 hex 选项。 • 但是他的输出会保存到一个字符串里。 • 调用成员函数 .str() 就能取出这个字符串了。 • 之后这个字符串就可以用作其他用途,比如 printf 打印,或者用于查询数据库,都没问题。 • 这里比较无聊,最后还是直接输出到了0 码力 | 162 页 | 40.20 MB | 1 年前3
共 10 条
- 1