函数后向量赋值的性能

Performance of vector assignment after function

本文关键字:性能 赋值 向量 函数      更新时间:2023-10-16

我使用以下代码:

MainLoop() {
    for (int i = 0; i < length; i++) {
        XMVector3Rotate(rays[i], orientation);
    }
}

我有 fps 1900000,但是当我使用这个时:

MainLoop() {
    for (int i = 0; i < length; i++) {
        calculatedRays[i] = XMVector3Rotate(rays[i], orientation);
    }
}

我的帧率 = 200。为什么?

当你这样做时:

XMVector3Rotate(rays[i], orientation);

编译器内联了函数 - 并且看到,因为它的结果从未在任何地方分配 - 它实际上没有任何事情,并完全删除了函数调用。它非常快,因为它实际上什么都不做。

但是,当您添加作业时:

calculatedRays[i] = XMVector3Rotate(rays[i], orientation);
突然之间,

你开始做一堆内存读取和写入以及各种数学运算 - 所有这些都在以前被跳过了。

(您已经标记了此 XNA - 但这是一个C++函数。大多数C++编译器都可以并且将会像这样内联函数。标准 C# 编译器不能。

在第一个示例中,函数的结果立即被丢弃(未分配)。编译器足够聪明,可以感知到这一点,并省略了方法调用......

假设 XMVector3Rotate 返回 XNA Vector3 类型,这将是一个结构复制操作,性能相对昂贵。

在为 XBox360 优化我自己的 XNA 游戏时,我用ref参数类型替换了许多此类操作,在繁重的循环中获得了非常明显的收益。

编辑:示例(来自内存)

Vector3 vec1 = something, vec2 = something, result;
Vector3.Add(ref vec1, ref vec2, out result);