应用 waPC (rust) 做软件测试工具
to modified request • 模拟数据规则 • 自动化测试 • https://github.com/wasmmock/ wasm_mock_server • 用 rust 打包所有测试需求 Wasm mock server Why use rust ? Software testing tool • 模拟数据规则 • 自动化测试 • Company's own protocol backend product line with complex upstream • Common testing platform 大公司抓包工具的需求 软件测试工具 • 模拟数据规则 • 自动化测试 • Supports http/https/tcp/websocket(MITM) • Can use rust to construct own protocol • websocket stand in for wasm API 抓包 - Wasm Mock Server wasm 工具 does not invent the wheel 软件测试工具 • 模拟数据规则 • 自动化测试 ModifyRequest(req *http.Request) error{ … req_,err:=wasm.Invoke(ctx,req.url.path, req_payload)0 码力 | 30 页 | 2.50 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 11 现代 CMake 进阶指南
-D 选项:指定配置变量(又称缓存变量) • 可见 CMake 项目的构建分为两步: • 第一步是 cmake -B build ,称为配置阶段( configure ),这时只检测环境并生成构建规则 • 会在 build 目录下生成本地构建系统能识别的项目文件( Makefile 或是 .sln ) • 第二步是 cmake --build build ,称为构建阶段( build ),这时才实际调用编译器来编译代码 Linux 的 make , Windows 的 MSBuild ),从而让构建规则可以只写一份,跨平 台使用。 • 过去的软件(例如 TBB )要跨平台,只好 Makefile 的构建规则写一份, MSBuild 也写一份 。 • 现在只需要写一次 CMakeLists.txt ,他会视不同的操作系统,生成不同构建系统的规则文件。 • 那个和操作系统绑定的构建系统( make 、 MSBuild MSBuild )称为本地构建系统( native buildsystem )。 • 负责从 CMakeLists.txt 生成本地构建系统构建规则文件的,称为生成器( generator )。 -G 选项:指定要用的生成器 • Linux 系统上的 CMake 默认用是 Unix Makefiles 生成器; Windows 系统默认是 Visual Studio 2019 生成器; MacOS0 码力 | 166 页 | 6.54 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 01 学 C++ 从 CMake 学起
为什么需要构建系统( Makefile ) • 文件越来越多时,一个个调用 g++ 编译链接会变得很麻烦。 • 于是,发明了 make 这个程序,你只需写出不同文件之间的依赖关系,和生成各文件的规则。 • > make a.out • 敲下这个命令,就可以构建出 a.out 这个可执行文件了。 • 和直接用一个脚本写出完整的构建过程相比, make 指明依赖关系的好处: 1. 当更新了 hello.o ,而不需要把 main.o 也重新编译一遍。 2. 能够自动并行地发起对 hello.cpp 和 main.cpp 的编译,加快编译速度( make -j )。 3. 用通配符批量生成构建规则,避免针对每个 .cpp 和 .o 重复写 g++ 命令( %.o: %.cpp )。 • 但坏处也很明显: 1. make 在 Unix 类系统上是通用的,但在 Windows 则不然。 2 2. 需要准确地指明每个项目之间的依赖关系,有头文件时特别头疼。 3. make 的语法非常简单,不像 shell 或 python 可以做很多判断等。 4. 不同的编译器有不同的 flag 规则,为 g++ 准备的参数可能对 MSVC 不适用。 构建系统的构建系统( CMake ) • 为了解决 make 的以上问题,跨平台的 CMake 应运而生! • make 在 Unix 类系统上是通用的,但在0 码力 | 32 页 | 11.40 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 12 从计算机组成原理看 C 语言指针
unsigned long 类型 • 32ULL 是 unsigned long long 类型 • 小写也是可以的: • 32ull 也是 unsigned long long 类型 字面常量的特殊规则:如果 int 表示不下,则自动选择较大的类型 标准化的类型: stdint.h • 而实际上,尽管主流操作系统上 int 都是 32 位的, C 语言标准并没有规定 int 就是 32 位 的。 short ,根据补码的规则仍是 - 128 。 实验:不同大小之间的整数互转 • 例如 char 类型的 127 是 011111111 • 强制转换为 short 后是 00000000 011111111 • 可见符号位还是被完全填充到了 short 的前一个字节 ,这次因为符号位是 0 ,所以 short 的高位也全部 填满了 0 ,对值没有影响,根据补码的规则仍是 127 。 • 例如 char 类型的 -128 是 10000000 • 强制转换为 short 后是 00000000 10000000 • 可见 short 的前一个字节被填满了 0 ,根据补码的 规则他是一个正数 128 。 实验:自动类型提升( type promotion ) • 一个较小类型的 short 和较大类型的 int 相加会得到什么类型?会得到 int 类型。 • 结论:小类型和大类型做数学运算(0 码力 | 128 页 | 2.95 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 17 由浅入深学习 map 容器
中的 K-V 对执行了一遍循环体。 迭代器 operator++ 的移动方向 • 迭代器的 ++ 是中根遍历,先左子节点,然后根节点,最后右子节点。 • 为什么是中根遍历?因为刚刚说了二叉排序树的规则是:左子节点<父节点<右子节点。 • 这刚好是中根遍历的顺序,左中右。所以迭代器的 ++ 方向刚好是 K 越来越大的方向。 • 结论:遍历时,总是会按 K 从小到大的顺序。 k k k k 查找为什么高效 • 这就是二叉排序树的构建规则。 • 对于所有节点,都要满足:他左子节点的值 < 该节点的值 < 他右子节点值 • 这到底有什么好处?是不是 C++ 之父觉得排序很好玩所以才排的? 1 4 5 8 7 排序增好玩 排序增好玩 小 大 2 set 查找为什么高效 • 可以证明,只要保证这个树是排序的,那么快速查找到任意一个数的通用规则是: • 设要找的数为 X ,则 set0 码力 | 90 页 | 8.76 MB | 1 年前3C++高性能并行编程与优化 - 课件 - Zeno 中的现代 C++ 最佳实践
clone 的实现。这里我们用 std::decay_t快速获取了 this 指针所指向的类型,也就是当前所在类的类型 。 • 宏的缺点是他不遵守命名空间的规则,宏的名 字是全局可见的,不符合 C++ 的高大尚封装思 想。 • 宏: IOBJECT_DEFINE_CLONE • 高大尚 C++ 封装: zeno::IObject::clone() 函数静态初始化可用于“懒汉单例模式” • 如右图。 • getMyClassInstance() 会在第一次调用时创 建 MyClass 对象,并返回指向他的引用。 • 根据 C++ 函数静态变量初始化的规则,之后 的调用不会再重复创建。 • 并且 C++11 也保证了不会多线程的危险, 不需要手动写 if 去判断是否已经初始化过, 非常方便! 函数静态初始化和全局静态初始化的配合 • 如果在全局静态初始化( 0 码力 | 54 页 | 3.94 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 02 现代 C++ 入门:RAII 内存管理
构造函数! 编写我们自己的 vector 类! 看来 vector 也不过如此!让我们自己实现一个 Vector 类试试看 吧 It works! 这个 Vector 类有哪些问题? 三五法则:规则类怪谈 1. 如果一个类定义了解构函数,那么您必须同时定义 或删除拷贝构造函数和拷贝赋值函数,否则出错。 2. 如果一个类定义了拷贝构造函数,那么您必须同时 定义或删除拷贝赋值函数,否则出错,删除可导致 • 常见的有 std::vectorconst &arr 等。 • 注:有的教材喜欢这样: const Pig &pig ,仅仅是个人喜好不同,没有实际区 别。 函数参数类型优化规则:按引用还是按值? • 如果是基础类型(比如 int , float )则按值传递: • float squareRoot(float val); • 如果是原始指针(比如 int * , Object 0 码力 | 96 页 | 16.28 MB | 1 年前3C++高性能并行编程与优化 - 课件 - 15 C++ 系列课:字符与字符串
例如 “ helloworld”.replace(400, 2, “pful”) 会得到异常(和 at 同 款) • 启发性提示:因为 -1 转换为 size_t 后是个很大的数(因为补码 的规则,他实际上变成 0xffffffffffffffff ),所以可以给 len 指定 - 1 (或者 string::npos )来迫使 replace 从 4 开始一直到字符串 末尾都替换掉,例如 “ 更高效(不需 要分配一个新 string 对象)。 string_view 有的都是这些只读的函 数;没有的都是 replace 、 append 、 insert 这一类需要修改自身 的函数。 类型转换规则一览 • const char * === 隐式 ==O(n)==> string_view • string === 隐式 ==O(1)==> string_view • const char *0 码力 | 162 页 | 40.20 MB | 1 年前3Borsh 安全高效的二进制序列化
NEAR 智能合约 Case Study Solana 智能合约 Case Study • non self-describing • 保证序列化后的二进制唯一性和确定性 • 主要序列化规则 Borsh 规范 • 整数采用低字节序( little endian) 存储 • 对于动态长度的集合,先用一个 u32 存储集合 size • 对于原本无序的集合(如 hashmap ),存储时使用0 码力 | 21 页 | 3.35 MB | 1 年前3基于 Rust Arrow Flight 的物联网和时序数据传输及转换工具 霍琳贺
支持标准 SQL 写入,支持批量写入 支持 Schemaless 写入 支持从 Kafaka, MQTT, OPC, PI System 以及文 件直接导入 数据源导入时,可定义规则引擎 TDengine: 与上下游应用的关系 TDengine = Time-Series Database + Caching + Data Subscription + Stream Processing0 码力 | 29 页 | 2.26 MB | 1 年前3
共 15 条
- 1
- 2