函数后向量赋值的性能

时间:2011-05-10 14:58:48

标签: c++ performance directx xna-math-library

我使用此代码:

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);
    }
}

我有fps = 200。 为什么呢?

3 个答案:

答案 0 :(得分:7)

当你这样做时:

XMVector3Rotate(rays[i], orientation);

猜测编译器内联函数 - 并且看到它,因为它的结果从未在任何地方被赋值 - 它实际上并不任何东西,并删除了函数调用完全。它非常快,因为它实际上并没有做任何事情。

但是当你添加作业时:

calculatedRays[i] = XMVector3Rotate(rays[i], orientation);

突然之间,你正在做一堆内存读写和各种数学操作 - 所有这些操作都被忽略了。

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

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

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

编辑:示例(来自内存)

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