|
52 | 52 | - 实现 `Pack()` 泛型序列化器 |
53 | 53 | - 提供包装类型:`Str`, `Bin`, `EXT`, `Timestamp` |
54 | 54 | - 导出工具函数:`wrapStr()`, `wrapBin()`, `wrapEXT()` |
| 55 | +- 导出常量结构体:`FixLimits`, `IntBounds`, `FixExtLen`, `TimestampExt`, `MarkerBase` |
55 | 56 |
|
56 | 57 | #### `src/compat.zig` (兼容层) |
57 | 58 | - 提供 `BufferStream` 跨版本实现 |
|
67 | 68 |
|
68 | 69 | ## 3. 核心 API 规范 |
69 | 70 |
|
| 71 | +### 3.0 常量组织 |
| 72 | + |
| 73 | +### 9.4 性能优化指南 |
| 74 | + |
| 75 | +1. **使用内联函数**:频繁调用的小函数添加 `inline` 关键字 |
| 76 | +2. **利用泛型**:避免为每个类型重复相似代码 |
| 77 | +3. **使用 switch**:比 if-else 链更高效(编译器可优化为跳转表) |
| 78 | +4. **减少分支**:简化控制流,提升分支预测准确性 |
| 79 | +5. **复用辅助函数**:如 `writeIntRaw`, `readIntRaw`, `writeDataWithLength` |
| 80 | +库提供了组织化的常量结构体,方便使用和理解: |
| 81 | + |
| 82 | +```zig |
| 83 | +// MessagePack 格式限制 |
| 84 | +msgpack.FixLimits.POSITIVE_INT_MAX // 127 |
| 85 | +msgpack.FixLimits.STR_LEN_MAX // 31 |
| 86 | +msgpack.FixLimits.ARRAY_LEN_MAX // 15 |
| 87 | +msgpack.FixLimits.MAP_LEN_MAX // 15 |
| 88 | +
|
| 89 | +// 整数类型边界 |
| 90 | +msgpack.IntBounds.UINT8_MAX // 0xff |
| 91 | +msgpack.IntBounds.UINT16_MAX // 0xffff |
| 92 | +msgpack.IntBounds.INT8_MIN // -128 |
| 93 | +
|
| 94 | +// 固定扩展类型长度 |
| 95 | +msgpack.FixExtLen.EXT4 // 4 |
| 96 | +msgpack.FixExtLen.EXT8 // 8 |
| 97 | +
|
| 98 | +// Timestamp 相关常量 |
| 99 | +msgpack.TimestampExt.TYPE_ID // -1 |
| 100 | +msgpack.TimestampExt.FORMAT32_LEN // 4 |
| 101 | +msgpack.TimestampExt.NANOSECONDS_MAX // 999_999_999 |
| 102 | +``` |
| 103 | + |
70 | 104 | ### 3.1 Payload 创建方法 |
71 | 105 |
|
72 | 106 | #### 基本类型(栈分配,无需 free) |
@@ -106,8 +140,22 @@ payload.mapPut(key: []const u8, val: Payload) !void // 插入/更新键值对 |
106 | 140 |
|
107 | 141 | #### 类型转换 |
108 | 142 | ```zig |
109 | | -payload.getInt() !i64 // 尝试获取 i64(uint 可转换,超范围报错) |
110 | | -payload.getUint() !u64 // 尝试获取 u64(负数 int 报错) |
| 143 | + // 宽松转换(允许类型转换) |
| 144 | + payload.getInt() !i64 // uint 可转换为 i64(如果在范围内) |
| 145 | + payload.getUint() !u64 // 正数 int 可转换为 u64 |
| 146 | + |
| 147 | + // 严格转换(不允许类型转换) |
| 148 | + payload.asInt() !i64 // 只接受 .int 类型 |
| 149 | + payload.asUint() !u64 // 只接受 .uint 类型 |
| 150 | + payload.asFloat() !f64 // 只接受 .float 类型 |
| 151 | + payload.asBool() !bool // 只接受 .bool 类型 |
| 152 | + payload.asStr() ![]const u8 // 只接受 .str 类型 |
| 153 | + payload.asBin() ![]u8 // 只接受 .bin 类型 |
| 154 | + |
| 155 | + // 类型检查 |
| 156 | + payload.isNil() bool // 检查是否为 nil |
| 157 | + payload.isNumber() bool // 检查是否为数字(int/uint/float) |
| 158 | + payload.isInteger() bool // 检查是否为整数(int/uint) |
111 | 159 | ``` |
112 | 160 |
|
113 | 161 | ### 3.3 序列化/反序列化 |
@@ -366,6 +414,8 @@ test "描述性测试名称" { |
366 | 414 | - [ ] 是否添加了测试用例? |
367 | 415 | - [ ] 是否兼容 Zig 0.14-0.15? |
368 | 416 | - [ ] 是否更新了相关文档? |
| 417 | +- [ ] 是否使用了适当的 inline 提示? |
| 418 | +- [ ] 是否避免了代码重复? |
369 | 419 |
|
370 | 420 | --- |
371 | 421 |
|
@@ -531,6 +581,18 @@ TIMESTAMP_EXT_TYPE: i8 = -1 |
531 | 581 | - 实现三种 timestamp 格式(32/64/96 位) |
532 | 582 | - 添加 Timestamp.toFloat() 转换方法 |
533 | 583 | - 完整测试覆盖所有边界情况 |
| 584 | +
|
| 585 | +[2025-10-18] [Optimization] 高优先级性能优化 |
| 586 | +- markerU8To 改用 switch 表达式(+10-20% 解析性能) |
| 587 | +- 整数读写泛型化(减少150行重复代码) |
| 588 | +- 添加 inline 提示到25+个热点函数(+5-15% 性能) |
| 589 | +
|
| 590 | +[2025-10-18] [Refactor] 中优先级代码重构 |
| 591 | +- 常量重组为语义化结构体(FixLimits, IntBounds 等) |
| 592 | +- 拆分 readExtValueOrTimestamp 为多个小函数 |
| 593 | +- 统一数据写入逻辑(writeDataWithLength) |
| 594 | +- 添加严格类型转换 API(asInt, asUint, asFloat 等) |
| 595 | +- 添加类型检查方法(isNil, isNumber, isInteger) |
534 | 596 | ``` |
535 | 597 |
|
536 | 598 | --- |
|
0 commit comments