Borsh 安全高效的二进制序列化Rust 开发者大会 安全高效的二进制序列化 Daniel Wang @ NEAR Borsh • 运行、编码效率 • 确定性 • 跨平台兼容性 二进制序列化的问题 Binary Object Representation Serializer for Hashing • 字节级别确定性 • 执行速度快 Borsh • 轻量级 • 每一个对象与其二进制表示之间都存在一个双射映射 • 不同的对象的二进制表示一定不同 • 便于基于二进制表示进行 Hash 字节级别确定性 • 在 Rust 中, borsh 并没有使用 serde • 全部逻辑原生实现 • 序列化、反序列化速度大幅领先其他解决方案 执行速度 执行速度 benchmark 执行速度 benchmark 执行速度 benchmark 执行速度 benchmark • 编译后的体积更小 • borsh borsh 序列化后的二进制更精简 轻量级 序列化结果体积对比 Borsh 基本用法 Case Study NEAR 智能合约 Case Study Solana 智能合约 Case Study • non self-describing • 保证序列化后的二进制唯一性和确定性 • 主要序列化规则 Borsh 规范 • 整数采用低字节序( little endian) 存储0 码力 | 21 页 | 3.35 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 03 现代 C++ 进阶:模板元编程GPU 专题: wrap 调度,共享内存, barrier 9.并行算法实战: reduce , scan ,矩阵乘法等 10.存储大规模三维数据的关键:稀疏数据结构 11.物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 因此模板元编程对高性能编程很重要。 • 通常来说,模板的内部实现需要被暴露出来,除非使用特殊的手 段,否则,定义和实现都必须放在头文件里。 • 但也正因如此,如果过度使用模板,会导致生成的二进制文件大 小剧增,编译变得很慢等。 boost 编译慢的原因找到了……因为他们用了大量的模板 。 模板的应用:编译期优化案例 • 在右边这个案例中,我们声明了一个 sumto 函数,作用是求出从 is_same_v= true • is_same_v = false • 更多这类模板请搜索 c++ type traits 。 lambda 用途举例:立即求值 再也不需要烦人的 flag 变量 lambda 用途举例:局部实现递归 搜索关键字:匿名递归 恭喜!你已经基本学废了 lambda 表达式! • 总结: 1. lambda 作为参数:用 template 0 码力 | 82 页 | 12.15 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南调试模式,完全不优化,生成调试信息,方便调试程序 • Release 发布模式,优化程度最高,性能最佳,但是编译比 Debug 慢 • MinSizeRel 最小体积发布,生成的文件比 Release 更小,不完全优化,减少二进制体积 • RelWithDebInfo 带调试信息发布,生成的文件比 Release 更大,因为带有调试的符号信 息 • 默认情况下 CMAKE_BUILD_TYPE 为空字符串,这时相当于 Debug 上找不到 Qt5 包怎么办?我明明安装 了! 你是 Windows 系统,可能你安装了 Qt5 ,但是因为 Windows 系统的安装路径非常混乱, 没有固定的 /usr/lib 之类的默认路径可以搜索,所以出错了。 常见问题:小彭老师, Windows 上找不到 Qt5 包怎么办?我明明安装 了! • 假设你的 Qt5 安装在 C:\Qt\Qt5.14.2 ,则你去找找这个目录: • C:\Qt\Qt5 >Config.cmake 所 在位置 • 第二种是设置 Qt5_DIR 这个变量为 C:\Qt\Qt5.14.2\msvc2019_64\lib\cmake 。 • 这样只有 Qt5 这个包会去这个目录里搜索 Qt5Config.cmake ,更有针对性。 • 第三种 ( 推荐 ) ,直接在命令行通过 -DQt5_DIR=”xxx” 指定,这样不用修改 CMakeLists.txt 。 • 第四种,还可以通过设置环境变量0 码力 | 166 页 | 6.54 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针*arr = (int *)malloc(size); • 如果你没看出来(哪怕是其中一个),那就要好好上小彭老师的课哦! 字节( byte ) 和位( bit )有什么区别 • 众所周知,计算机是二进制的,存储的实际上是一个个 0 和 1 。 • 每个存储 0 或 1 的空间称为一个位( bit ),一位可以存储 0 或 1 两个可能的值。 • 现在的计算机都会把 8 个位打包成一个字节( byte 这就是为什么现在的计算机都升级到 64 位了,因为能表示更大范围的 [ 数据删除 ] 嘛。 有符号整数 vs 无符号整数 • 有时候我们是需要表示负数的。而刚刚那种二进制的做法,只能表示正数和零。 • 怎么办?可能有的同学会想,不妨这样来设计:让二进制的最高位表示符号位。 • 比如 00000011 表示 3 , 10000011 表示 -3 ,这样不就区分开来了吗?这叫做原码表示 法。 • 的确可 ,也就是大名鼎鼎的补码表示法。 • 这样做的目的是,利用加法器的“溢出”机制,例如 -1 + 2 = 1 ,在计算机看来就是: • 11111111 + 00000010 = 100000001 • 正好和普通的二进制加法一样,只需要丢弃最前面的那一位进位就可以了。 • 这样就重用了现有的无符号加法器,从而节省了宝贵的电路板空间。 • 补码和反码一样,让有符号整数可以表示 -128 到 127 。 • 其中负数的范围反而比正数大是因为要回避0 码力 | 128 页 | 2.95 MB | 1 年前3
谈谈MYSQL那点事使用三个文件定义一个表: .MYI .MYD .frm .MYI .MYD .frm • 少碎片、支持大文件、能够进行索引压缩 少碎片、支持大文件、能够进行索引压缩 • 二进制层次的文件可以移植 二进制层次的文件可以移植 (Linux (Linux Windows) Windows) • 访问速度飞快,是所有 访问速度飞快,是所有 MySQL MySQL 文件引擎中速度最快的0 码力 | 38 页 | 2.04 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 10 从稀疏数据结构到量化数据类型com/video/BV1fa411r7zp 课程 PPT 和代码: https://github.com/parallel101/course 本课涵盖:稀疏矩阵、 unordered_map 、空间稀 疏网格、位运算、浮点的二进制格式、内存带宽优 化 面向人群:图形学、 CFD 仿真、深度学习编程人 员 第 0 章:稀疏矩阵 稠密数组存储矩阵 用 foreach 包装一下枚举的过程 改用 map 来存储 分离 read/write/create 的图形学应用中,就非常浪费内存带宽。 使用 float :每个占据 4 字节 • 可以用单精度的 float ,只占据 4 字节。 • 因为这里的循环体是内存瓶颈( membound ), 就直接加快了 2 倍! 浮点数的二进制存储格式 • 计算机存储浮点数的格式,很像科学计数法: ±1.ffffffff * 2^eee (区别在于他是二的指数) • 其中 f 是底数, e 是指数。正负号 ± 通过符号位来表示( 0 表示正,0 码力 | 102 页 | 9.50 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 07 深入浅出访存优化code) ?有什么用? • 如 x=x1x2x3, y=y1y2y3 • 则他们的莫顿码: m(x,y)=y1x1y2x2y3x3 • 二维莫顿编码可以把两个长度为 n 的二进制数,交错打包成一个长度 2*n 的二进制数。而莫顿编码的逆运算,就是莫顿解码: • mdec(m1m2m3m4)=(m2m4, m1m3) • 莫顿码的几何意义在于,以 (x,y)=mdec(t) 为参数方程,可以生成一0 码力 | 147 页 | 18.88 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串,内存管理与对象生命周期 ASCII 码 第 1 章 计算机如何表达字符 https://zh.wikipedia.org/wiki/ASCII 计算机如何表达字符 • 众所周知,计算机只能处理二进制 整数,字符要怎么办呢? • 于是就有了 ASCII 码表,他规定, 每个英文字符(包括大小写字母、 数字、特殊符号)都对应着一个整 数。在计算机里只要存储这个的整 数,就能代表这个字符了。 、 4 字节之间变长的编码。 • 其中 1 字节就是 ASCII 部分 0x00~0x7F ,剩余的部分根据他们 在 Unicode 中的顺序,依次变长。作为变长编码的代价, UTF-8 需要在二进制中浪费很多额外的空间来表示,导致中文汉字需要 3 字节才能存储。好处是这能完全兼容以前 const char * 的那套代码 ,包括 ‘ \0’ 结尾字符串都可以继续正常使用,不用全换到 wchar_t0 码力 | 162 页 | 40.20 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 16 现代 CMake 模块化项目管理指南负责处理全局有效的设定。而子 项目的 CMakeLists.txt 则仅考虑该子项目自身的设定,比 如他的头文件目录,要链接的库等等。 四、子项目的头文件 • 这里我们给 biology 设置了头文件搜索路径 include 。 • 因为子项目的 CMakeLists.txt 里指定的路径都是相对路径 ,所以这里指定 include 实际上是:根 /biology/include 。 • 注意我们用了 /biology/include 现在也加入 pybmain 的 头文件搜索路径了,因此 pybmain 里可以 #include 到 biology 的头文件。 • 同理如果又有一个 target_link_libraries(zxxpig PUBLIC pybmain) 那么 zxxpig 也有 pybmain 和 biology 的所有头文件搜索路径了。( PUBLIC 的原理详见第一期课程) 传染给 负责把包配置文件放到这里。如果第三方库的作者比较懒,没提供 CMake 支持(由安装 程序提供 XXXConfig.cmake ),那么得用另外的一套方法( FindXXX.cmake ),稍后细 谈。 Windows 系统下的搜索路径 •/ • /cmake/ • / */ • / */cmake/ • / 0 码力 | 56 页 | 6.87 MB | 1 年前3
C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起GPU 专题: wrap 调度,共享内存, barrier 9.并行算法实战: reduce , scan ,矩阵乘法等 10.存储大规模三维数据的关键:稀疏数据结构 11.物理仿真实战:邻居搜索表实现 pbf 流体求解 12.C++ 在 ZENO 中的工程实践:从 primitive 说起 13.结业典礼:总结所学知识与优秀作业点评 I 硬件要求: 64 位( 32 位时代过去了) 至少 printf 等一系列函数声明的头文件而已,实际的实现是在 libc.so 这个动态库里。其中这种形式表示不要在当前目录下搜索,只在系统目 录里搜索,” hello.h” 这种形式则优先搜索当前目录下有没有这个文件,找不到再搜索系统 目录。 • 此外,在实现的文件 hello.cpp 中也导入声明的文件 hello.h 是个好习惯: 1. 可以保证当 hello.cpp out 的头文件搜索目录: ( 其中第一个 hellolib 是库名,第二个是目录 ) • 这样甚至可以用 来引用这个头文件了,因为通过 target_include_directories 指 定的路径会被视为与系统路径等价: 子模块的头文件如何处理(续) • 但是这样如果另一个 b.out 也需要用 hellolib 这个库,难道也得再指定一遍搜索路径吗? • 不需要,其实我们只需要定义 0 码力 | 32 页 | 11.40 MB | 1 年前3
共 15 条
- 1
- 2













