You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

序列化时更小Vec分配反而更慢?Borsh优化的性能谜题

性能反常原因分析

你的实现和原版Borsh序列化的性能差异,核心在于**「预计算大小的开销」和「Vec扩容开销」的此消彼长**:

1. 当Vec字段为900元素时:原版更快的原因

原版borsh::to_vec初始分配1024字节的Vec。假设你的元素序列化后单条大小为1字节,那么整个Vec字段的序列化总大小是4字节(u32长度标识) + 900字节(元素数据)= 904字节,远小于1024的初始容量。这意味着原版序列化过程中不需要任何扩容操作,直接在预分配的内存里写入数据即可。

而你的FastBorshSerialize需要先调用borsh_size()计算精确容量,这个过程需要遍历Vec的所有元素来累加大小——对于900个元素来说,这个遍历计算的额外开销,远远超过了「精确分配内存」带来的收益,最终导致整体耗时更高。

2. 当Vec字段为1000元素时:你的实现更快的原因

此时Vec字段的序列化总大小是4 + 1000 = 1004字节,超过了原版的1024初始容量。原版在序列化到一半时,Vec会触发扩容:操作系统需要分配一块更大的内存,然后把原有数据拷贝过去,这个内存分配+拷贝的开销非常大。

而你的实现通过borsh_size()精确计算了所需容量,直接分配刚好足够的内存,完全避免了扩容操作。此时「预计算大小的开销」被「避免扩容的收益」完全覆盖,所以整体耗时比原版低很多。

额外优化建议

  • 如果你的场景中大部分结构体的序列化大小都接近或超过1024字节,那么你的实现依然是更优的选择。
  • 可以考虑为borsh_size()的派生宏添加更多编译期优化,比如对于固定大小的类型(如基础类型、固定长度数组)直接用常量计算,避免运行时遍历。

内容的提问来源于stack exchange,提问作者Ahmet Yazıcı

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 20:02:48