Rust分布式账务系统 - 胡宇独角兽,业务遍布全球 关于我们: Airwallex 墨尔本 新加坡 伦敦 深圳 香港 北京 旧金山 上海 东京 班加罗尔 阿姆斯特丹 西安 马来西亚 币种 50+ 国家 130+ 办公地点 19 1300+ 员工 提供高效,低成本的数字银行服务 关于我们: Airwallex 从设计架构到实现细节 项目介绍 分布式账务系统 Fintech 互联网 正确性 bug=0 码力 | 27 页 | 12.60 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台重视开发者体验,工程师不再做脏活累活 传统 DevOps 体系 Zadig 云原生 DevOps 平台 高人效 低人效 低人效 / 低质量 / 低效率 / 高成 本: 人淹没在系统的海洋里,无数平台手工切换 高人效 / 高质量 / 高效率 / 低成 本: 人在系统之外 / 上,复杂性下沉到单一平台 希望 工程师不再花时间在开发写代码之外的脏活累活,比如服务部署、找环境,服务编排等 个月核心重构 65% 功能实现开源 支撑开源社区开发者环境 易 用 性 增 强 接入:安装 10 分钟以内,成功率达 90% 集成环境:支持开发者 Remote debug 工作流:效率和性能、开发者体验提升 贡献者流程建立 开 放 社 区 搭 建 2021 年 5 月 2021 年 7 月 2021 年 9 月 2021 年 11 月 2021 年 12 月 1 个月功能改造 DevOps 方案 ZadigX 云原生 DevOps 方案 降本提效 组织能力提升 业务负责人 研发不透明,规划凭感觉: • 发版时间靠运气 • 团队熬夜冲进度 研发透明化:不同项目清晰可见的效率、质量、进度 进度管理:根据团队客观数据,预测和确定项目规划 迭代进度一目了然 项目从无到有可核算 管理有数据科学依据 解放管理,更多时间花在 业务创新 平台运维 业务压力大,能力建设缓慢:0 码力 | 59 页 | 81.43 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化可见数据量较小时,实际带宽甚至超过了 理论带宽极限 42672 MB/s ! • 而数据量足够大时, 才回落到正常的带宽 。 • 这是为什么? CPU 内部的高速缓存 • 原来 CPU 的厂商早就意识到了内存延迟高,读写效率低 下的问题。因此他们在 CPU 内部引入了一片极小的存储 器——虽然小,但是读写速度却特别快。这片小而快的 存储器称为缓存( cache )。 • 当 CPU 访问某个地址时,会先查找缓存中是否有对应的 数据,那就需要向主内存发送写入请求,等他写入成功, 才能安全移除这个条目。 • 如有多级缓存,则一级缓存失效后会丢给二级缓存。 连续访问与跨步访问 • 如果访问数组时,按一定的间距跨步访问,则效率如何? • 从 1 到 16 都是一样快的, 32 开始才按 2 的倍率变慢,为什么? • 因为 CPU 和内存之间隔着缓存,而缓存和内存之间传输数据的最小 单位是缓存行( 64 字节)。 16 通常的情况都是 pos+=vel ,也就是 pos 是读写, vel 是只读,那这时候就 用 SOA 比较好,省内存带宽。 • 不过“ pos 的 xyz 分量用 AOS” 这个结论,是单从内存访问效率来看的,需 要 SIMD 矢量化的话可能还是要 SOA 或 AOSOA ,比如 hw04 那种的。而 “ pos 和 vel 应该用 SOA 分开存”是没问题的。 • 而且 SOA 在遇到存储不是0 码力 | 147 页 | 18.88 MB | 1 年前3
谈谈MYSQL那点事表结构设计原则 选择字段的一般原则是保小不保大,能用占用字节 少的字段就不用大字段。比如,主键,强烈建议用 int 整型 . 不用 bigint ,为什么 ? 省空间啊。空间是什么 ? 空间就是效率!按 4 个字节和按 32 个字节定位一条记 录,谁快谁慢太明显了。涉及几个表做 join 时, 效果 就更明显了。更小的字段类型占用的内存就更少,占用 的磁盘空间和磁盘 I/O 也会更少,而且还会占用更少的 DISTINCT DISTINCT 、 、 OR OR 、 、 IN IN 等语句的使用 等语句的使用 , , 避免使用联表查询和子查询,因为将使执行效率大大下降 避免使用联表查询和子查询,因为将使执行效率大大下降 能够使用索引的字段尽量进行有效的合理排列,如果使用了 能够使用索引的字段尽量进行有效的合理排列,如果使用了 联合索引,请注意提取字段的前后顺序 SELECT COUNT(*) FROM Tbl 在 在 InnoDB InnoDB 中将会扫描全 中将会扫描全 表 表 MyISAM MyISAM 中则效率很高 中则效率很高 MySQL MySQL 技巧分享 技巧分享 Explain Explain 使用 使用 语法: 语法: EXPLAIN SELECT EXPLAIN SELECT select_options0 码力 | 38 页 | 2.04 MB | 1 年前3
Zadig 产品使用手册则是面向开发者视角,中立,云原生一体化价值链平台。 与现存 DevOps 方案对比: 现存方案 典型代表 方案特点分析 Zadig 优势 传统 Jenkins 方案 GitLab + Jenkins + 脚本化 运行效率低,管理维护成本高 方案局限性大,安全性风险高 无法支持敏捷交付模式 支持从需求到发布全流程敏捷交付。尤其面向 多服务并行部署发布,云原生构建环境和运行 环境,基础设施对接及企业级 SSO/ 权限管理 布的全路径。 测试 发布 洞察 一堆复杂脚本、维护成本极高 员工手工操作费时费力易出错 手动更新服务、手动打包、交付 付效率低下、占据大量研发时间 、研发利用率极低 环境不透明、测试效率低下、测 试有效性低、大量手工、价值难 以体现 上下游烟囱式、协作效率低、团 队花大量时间在碎片化沟通和流 程制定上、各方能力受限、无法 快速响应市场需求 层级越高、对产研状态越模糊 管理低效、延误战机0 码力 | 52 页 | 22.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理针。比如右边这样: 更智能的指针: shared_ptr • 使用起来很困难的原因,在于 unique_ptr 解决重复释放 的方式是禁止拷贝,这样虽然有效率高的优势,但导致使 用困难,容易犯错等。 • 相比之下, 牺牲效率换来自由度的 shared_ptr 则允许 拷贝,他解决重复释放的方式是通过引用计数: 1. 当一个 shared_ptr 初始化时,将计数器设为 1 。 2 可以适当使用减轻初学者的压力,因为他的行为和 Python 等 GC 语言的引用计数机制很像。但从长远 来看是不行的,因为: 1. shared_ptr 需要维护一个 atomic 的引用计数器, 效率低,需要额外的一块管理内存,访问实际对象 需要二级指针,而且 deleter 使用了类型擦除技术 。 2. 全部用 shared_ptr ,可能出现循环引用之类的问题 ,导致内存泄露,依然需要使用不影响计数的原始0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 性能优化之无分支编程 Branchless Programming如果烧开水时被烫伤,则跳转到去医院 刷牙 5 分钟 嘴巴,手 看比站 15 分钟 眼睛 吃饭 30 分钟 嘴巴,手 拉粑粑 20 分钟 屁股 (无条件)跳转到结束 去医院 10 分钟 全身 结束 跳转指令对流水线效率的影响 • 然而跳转指令的存在使得流水线的并行变得很困难了。例如我们本来可以烧开水和刷牙同 时进行节省时间的,但是因为烧好开水以后还要判断“是否烫伤”才能决定接下来是正常刷牙 还是去医院。这意味 cmovle eax, edi 上一次比较结果为小于等于时,把 eax 设为 edi 的值,否则 eax 保持 不变。 • 因为不用破坏流水线,不需要分支预测,无分支指令往往更加高效, CPU 执行效率更高 。 • j 系列指令有 jle , jge , jl , je 等等。 set 系列指令有 setle , setge , setl 等等。 • 冷知识: 32 位时代 cmov 系列曾经是0 码力 | 47 页 | 8.45 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型1bit ,然后八个 合并成一个 int8_t 。 • 不过效率比我们手写的低很多…… 不推荐使用 std::vector• 不建议使用 vector 的原因:他返回的不是真正的引用,而是一个重载了 operator= 和 operator bool 的 std::_Bit_reference 对象,而且效率很低。 • 如果配合用 decltype 和 auto 的话,他们不会正确推导出 0 码力 | 102 页 | 9.50 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程没有捕获任何局 部变量,也就是 [] ,那么不需要用 std::function,直接用函数指针的 类型 int(int) 或者 int(*)(int) 即可。 • 函数指针效率更高一些,但是 [] 就没办法 捕获局部变量了(全局变量还是可以的) 。 • 最大的好处是可以伺候一些只接受函数指 针的 C 语言的 API 比如 pthread 和 atexit 。 全,且符合 RAII 思想,当设为 nullopt 时会自动释放内部的对象。 • 利用这一点可以实现 RAII 容器的提前 释放。和 unique_ptr 的区别在于他的 对象存储在栈上,效率更高。 variant :安全的 union ,存储多个不同类型的值 • 有时候需要一个类型“要么存储 int ,要么存储 float” ,这时候就可以用 std::variant 0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器行为一致。 • 很多初学者都会错误使用 [] 读取元素,他以为找不到键值会报错,结果他不报错,默默创 建了个 0 返回给你,导致实际报错的地方滞后,没发现错误在 map 的读取这里,严重影 响他的调试效率( javascript 的 undefined 直呼内行)。 写入 map 元素 • mapm; • 写入 map 中指定键值的元素有两种方法。 • m[“key”] 刚刚的构建方法是平衡二叉树。而实际 set 中采用的是更为高效的红黑树。 • 区别就是每个节点上多挂了一个 bool 类型的 flag 变量,表示这个节点是红是黑。 • 总之这样三下五除二下来他的插入效率比平衡二叉树高出一个常数,但复杂度还是 O(logn) 。 • 红黑树的具体异同我会放到最后再细讲,一下子讲太深都睡着了,反正只有插入和删除的 时候需要更新红黑 flag ,查找方面的方法是 0 码力 | 90 页 | 8.76 MB | 1 年前3
共 17 条
- 1
- 2













