相同LeetCode题Go实现比Rust快10倍,是否为内存分配策略导致?
问题解答
你的猜测仅占很小一部分原因,Rust版本性能远低于Go版本的核心问题是实现代码本身存在多处性能缺陷:
- 未开启release编译:Rust默认使用debug模式编译,不会做任何性能优化,而Go默认编译自带基础优化,两者编译优化等级不对等,仅开启
cargo run --release编译运行就能让Rust版本性能提升10倍以上。 - 递归时重复拷贝letters数组:你定义的gen函数每次调用都通过值传递传入letters数组,每次调用都会完整拷贝10*5的char数组,递归调用次数极多的情况下拷贝开销非常高,改为传递不可变引用即可消除该开销。
- 字符下标访问效率极低:Rust的字符串是UTF-8编码序列,
digits.chars().nth(index)是O(n)时间复杂度的操作,需要从字符串开头遍历到第index个字符才能取值,8位数字输入下每层递归调用都重复遍历,累计开销极高,可以提前将digits转为Vec<u8>或Vec<char>存储,后续直接用O(1)的下标访问取值。 - 容量预分配不合理:你在每层递归都预分配了4^8=65536大小的Vec,而底层递归实际仅需要存储3-4个字符串,巨量的预分配内存被浪费,大幅增加了内存分配和释放的开销,应该按照当前递归层实际需要的容量计算后再预分配。
你提到的Go GC内存复用确实有一定影响,但占比极低,修复上述所有代码缺陷后,Rust版本的运行速度会明显超过Go版本。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

