性能关键应用中:矩阵方法应返回自身引用还是新副本?
问题分析与解答
首先看这段Rust代码:
use Vec3::Vec3; struct Matrix3x3 { _array: [f64; 9], } impl Matrix3x3 { pub fn new(m: [f64; 9]) -> Self { Matrix3x3 { _array: m} } pub fn from_column_vectors(&self, cx: &Vec3, cy: &Vec3, cz: &Vec3) -> Matrix3x3 { let cx1 = cx.normalized(); let cy1 = cy.normalized(); let cz1 = cz.normalized(); self._array[0] = cx1.x; self._array[1] = cx1.y; self._array[2] = cx1.z; self._array[3] = cy1.x; self._array[4] = cy1.y; self._array[5] = cy1.z; self._array[6] = cz1.x; self._array[7] = cz1.y; self._array[8] = cz1.z; return Matrix3x3::new(self._array); } pub fn from_row_vectors(&self, rx: &Vec3, ry: &Vec3, rz: &Vec3) -> &Matrix3x3 { let cx1 = rx.normalized(); let cy1 = ry.normalized(); let cz1 = rz.normalized(); self._array[0] = cx1.x; self._array[1] = cy1.x; self._array[2] = cz1.x; self._array[3] = cx1.y; self._array[4] = cy1.y; self._array[5] = cz1.y; self._array[6] = cx1.z; self._array[7] = cy1.z; self._array[8] = cz1.z; return self; } }
先纠正代码错误
from_row_vectors方法现在的写法无法编译:它接收的是不可变引用&self,却试图修改self._array的内容——Rust的共享引用不允许修改内部数据,必须把参数改成&mut self才能进行修改,示例修正如下:
pub fn from_row_vectors(&mut self, rx: &Vec3, ry: &Vec3, rz: &Vec3) -> &mut Self { // 原有逻辑 self }
性能关键场景的方案选择
要结合业务场景判断:
1. 需要保留原矩阵的场景:选返回副本的实现
如果你的逻辑中原矩阵还需要继续使用,只能用from_column_vectors这种返回新副本的方式。不过不用担心性能:Matrix3x3内部是9个f64的固定数组,总共72字节,复制操作是栈上浅复制,现代CPU的L1缓存完全能覆盖这个数据量,复制开销微乎其微——除非是每秒调用上亿次的极端场景,否则这个成本可以忽略。
2. 可以复用原矩阵内存的场景:选修改原对象并返回引用的实现
如果原矩阵后续不再被使用,或者允许被覆盖,修正后的from_row_vectors(用&mut self)性能更优:它不需要分配新内存空间,直接在原对象的内存上修改数据,避免了复制操作,在性能关键路径上能减少不必要的内存操作开销。
额外提醒
这两种方案的核心差异不是性能,而是语义:返回副本是创建新对象,原对象不变;修改原对象是复用已有内存,但会改变原对象状态。性能选择要优先服从业务逻辑的语义需求,在语义允许的前提下,再选更高效的实现。
内容的提问来源于stack exchange,提问作者user366312
相关产品推荐
相关产品推荐

