Borsh 安全高效的二进制序列化第三届中国 Rust 开发者大会 安全高效的二进制序列化 Daniel Wang @ NEAR Borsh • 运行、编码效率 • 确定性 • 跨平台兼容性 二进制序列化的问题 Binary Object Representation Serializer for Hashing • 字节级别确定性 • 执行速度快 Borsh • 轻量级 • 每一个对象与其二进制表示之间都存在一个双射映射0 码力 | 21 页 | 3.35 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理C++ 的 解构函数是显式的,离开作用域自动销毁,毫不含 糊(有好处也有坏处,对高性能计算而言利大于 弊) 如果没有解构函数,则每个带有返回的分 支都要手动释放所有之前的资源 : RAII :异常安全( exception-safe ) C++ 标准保证当异常发生时,会调用已创建对象的解构函数 。 因此 C++ 中没有(也不需要) finally 语句。 如果此处不关闭,则可等 待稍后垃圾回收时关闭。 14f) 不会出错,但是 int{3.14f} 会出错,因为 {} 是非强制转换。 2. Pig(“ 佩奇” , 3.14f) 不会出错,但是 Pig{“ 佩奇” , 3.14f} 会出错,原因同上,更安全。 3. 可读性: Pig(1, 2) 则 Pig 有可能是个函数, Pig{1, 2} 看起来更明确。 • 其实谷歌在其 Code Style 中也明确提出别再通过 () 调用构造函数,需要类型转换时应该 如果需要允许用户拷贝你的 Vector 类对象 ,我们还是需要实现一下的。 • 发现了吗?其实不管是 size/resize 这样的 get/set 模式也好;自定义的拷贝构造函数 也好; RAII 保证异常安全也好;都是在为 面向对象思想的“封装:不变性”服务。 • 即:保证任何单个操作前后,对象都是处于 正确的状态,从而避免程序读到错误数据 (如空悬指针)的情况。 三五法则:拷贝赋值函数 •0 码力 | 96 页 | 16.28 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践 始终会返回 y ,哪怕 x 是 void 也没关系。因此只需要这样写就行: • static int helper = ( 任意表达式 , 0); 顺便一提: lambda 的妙用 • 小彭老师小技巧: • []{ xxx; yyy; return zzz; }() • 可以在表达式层面里插入一个语句块,本 质上是立即求值的 lambda 表达式(内部 是分号级别,外部是逗号级别)。 • Helper ),然后一个声明该类 的全局变量( helper ),就可以保证: • 1. 该类的构造函数一定在 main 之前执行 • 2. 该类的解构函数一定在 main 之后执行 • 该技巧可用于在程序退出时删除某些文件之类 。 • 这就是小彭老师的静态初始化 (static-init) 大法 。 静态初始化用于批量注册函数 • 我们可以定义一个全局的函数表(右图中的 functab 的对象,如果类型不是 T ,则出错。 NumericObject 的定义 • NumericObject 是基于 std::variant 的。 • 注意他的 get 成员函数,这和 std::get 相 比更安全,例如 value 是 int 类型,但用 户却调用了 get。则这里 is_constructible 是 true ,不会出错,而是 会自动把 float 转换成 int 0 码力 | 54 页 | 3.94 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针long 的大小应该和系统架构位数一样, 32 位系统上就 32 位, 64 位系统上就 64 位。 Windows 认为 long 不论 32 位系统还是 64 位系统都一样应该为 32 位,认为这样安全。 因此我们在编写 C 语言程序时,应该避免使用 long 类型,他会导致你的程序难以跨平台。 除了 long 之外的其他类型则没有区别,可以放心使用。 无符号整数: unsigned 修饰 有符号版本 用途举例:假如一个参数类 Params 非常复杂 ,然后函数是 func(Params *pars) ,这样只要 给 pars 传一个空指针,就表示“用户不想指定 这个参数”的意思。 C++ 可以用更安全的 func(std::optionalpars) 来替代。 NULL 的定义为什么是这样的? • 如果你看过标准库的头文件内容,会看到 NULL 的 本质无非是一个宏。那为什么要这样定义呢? 意类型的指针。 • 这样总算可以区分 func(int*) 和 func(int) 的重载了。 • 在现代 C++ 中,建议始终用 nullptr ,不 要再用 NULL 和 0 表示空指针了,不安全 。 来看看 GLIBC 的源码 数组的本质究竟是什么? 数组就是一堆在内存中紧密排列在一起的数 • 例如一个由 4 个字节组成的 char 数组,在内存中就是: 实验: char 类型数组 0 码力 | 128 页 | 2.95 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 04 从汇编角度看编译器优化关键字,号称:可以让一个变量使用寄存器存储,更高效。 • 都能把等差数列求和优化成 5050 的编译器笑着看着你,说道:还要你提醒吗? • 所以,如果某“面试官”试图“考考”你 register 和 inline 的所谓“优化技巧”,你直接把小彭 老师这两页 ppt ,贴到他脸上即可。 • 明明实验一下就知道的事,还在照着上世纪谭某强教材念。古有纸上谈兵,今有脑内编程 。 • 计算机编程又不是量子物理广义相对论,我们每个人都有电脑,做一下实验很容易,可总 总之,请勿用全局的数学函数,他们是 C 语言 的遗产。始终用 std::sin, std::pow 等。 abs(1.4f) = 1 ,因为 abs 是个参数类型为 int 的函数。 为了避免这种麻烦,请用安全的 std::abs(1.4f) = 1.4f 开启前: sqrt 矢量化失败 开启后: sqrt 矢量化成功 嵌套循环:直接累加,有指针别名问题 编译器担心 c 和 a 可能会指向同一个 地址,而连续判断三个指针是否有重合0 码力 | 108 页 | 9.47 MB | 1 年前3
谈谈MYSQL那点事互联网常用数据库市场占有率 互联网通用架构体制 谈谈 MySQL 数据库那些事 MySQL MySQL 基本介绍 基本介绍 MySQL MySQL 优化方式 优化方式 MySQL MySQL 技巧分享 技巧分享 Q Q & & AA MyISAM MyISAM 特点 特点 MyISAM vs MyISAM vs InnoDB InnoDB • 数据存储方式简单,使用 DELETE DELETE 或 或 INSERT INSERT 语句 语句 批量提交 批量提交 SQL SQL 语句 语句 MySQL MySQL 技巧分 技巧分 享 享 MySQL MySQL 技巧分享 技巧分享 常用技巧 常用技巧 使用 使用 Explain/ DESC Explain/ DESC 来分析 来分析 SQL SQL 的执行情况 的执行情况 使用 使用 Tbl 在 在 InnoDB InnoDB 中将会扫描全 中将会扫描全 表 表 MyISAM MyISAM 中则效率很高 中则效率很高 MySQL MySQL 技巧分享 技巧分享 Explain Explain 使用 使用 语法: 语法: EXPLAIN SELECT EXPLAIN SELECT select_options select_options0 码力 | 38 页 | 2.04 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南CMake 。 • 现代 CMake 和古代 CMake 相比,使用 更方便,功能更强大。 为什么要学习现代 CMake ? 现代 CMake : 古代 CMake : 第 0 章:命令行小技巧 传统的 CMake 软件构建 / 安装方式 • mkdir build • cd build • cmake .. • make -j4 • sudo make install • cd MinSizeRel: `-Os -DNDEBUG` 4. RelWithDebInfo: `-O2 -g -DNDEBUG` • 此外,注意定义了 NDEBUG 宏会使 assert 被去除掉。 小技巧:设定一个变量的默认值 如何让 CMAKE_BUILD_TYPE 在用户没有指定的时候为 Release ,指 定的时候保持用户指定的值不变呢。 就是说 CMake 默认情况下 CMAKE_BUILD_TYPE PROJECT_VERSION_PATCH 获取 z (补丁版本号)。 一些没什么用,但 CMake 官方不知为何就是提供了的项目字段…… 项目名的另一大作用:会设置另外 < 项目名 >_SOURCE_DIR 等变量 小技巧: CMake 的 ${} 表达式可以嵌套 因为 ${PROJECT_NAME} 求值的结果是 hellocmake 所以 ${${PROJECT_NAME}_VERSION} 相当于 ${hellocmake_VERSION}0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 09 CUDA C++ 流体仿真实战resample_kernel 。 • 首先通过 advect_kernel 算出对流后要采样的位置,写入到 loc 。然后再对 clr 和 vel 分别从 loc 算出的位置重 新采样。核函数的 gridDim 通过上整除技巧保证每个元素都能访问到, blockDim 为 8x8x8=512 。 • 如果在 resample_kernel 需要读取 clr ,然后再写入 clr ,并且读写是不同的坐标位置。 • 因此对0 码力 | 58 页 | 14.90 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 08 CUDA 开启的 GPU 编程多个线程,并行地给数组赋值 • 刚刚的 for 循环是串行的,我们可以把线 程数量调为 n ,然后用 threadIdx.x 作为 i 索引。这样就实现了,每个线程负责给数 组中一个元素的赋值。 小技巧:网格跨步循环( grid-stride loop ) • 无论调用者指定了多少个线程 ( blockDim ),都能自动根据给定的 n 区间循环,不会越界,也不会漏掉几个元 素。 • 这样一个0 码力 | 142 页 | 13.52 MB | 1 年前3
Zadig 面向开发者的云原生 DevOps 平台代码集成 xN 单元测试验证 xN 代码扫描 xN 自测、联调 xN 集成验证 xN 写测试用例 系统验证 xN 自动化测试 xN 性能测试 xN 安全测试 xN 数据变更 xN 代码变更 xN 配置变更 xN 部署测试环境 xN 部署预发环境 xN 部署生产环境 xN 部署 / 灰度上线 xN 监控 / 多业务联调艰难,诊断耗时多 • 出现问题诊断耗时多 • 流程割裂协作痛苦,响应慢 调试自测免打扰:本地 / 子环境免打扰,独立完成验证工作 自助验证更高效:自动化工作流 + 云上环境,高效验证调试 安全发布有信心: 一个平台完成日常 90% 工作,开发自助发布 需求研发总耗时降低 30% 需求迭代周期缩短 1-5 倍 解放开发,专注编码 更多的架构和技术提升 测试 效率和质量难以平衡: 验证有效性提升 100% 解放测试,全面自动化 提升效率,建设质量体系 安全 安全建设被动: • 安全建设缺乏时机和抓手 • 出现问题,影响业务进度 前置安全服务:全流程嵌入安全检测,避免流入业务环节。 全流程安全门禁:关键环节设置安全门禁,快速反馈研发改进 故障拦截率提升 1-3 倍 业务响应效率提升 3-5 倍 全流程安全建设 更多价值体现 组织 靠流程和个人,效率越来越低 • 低人效0 码力 | 59 页 | 81.43 MB | 1 年前3
共 24 条
- 1
- 2
- 3













