C++ 这是微优化的一种形式吗

标签 c++ micro-optimization

这是微优化,还是根本就是优化?

void Renderer::SetCamera(FLOAT x, FLOAT y, FLOAT z) {
    // Checking for zero before doing addition?
    if (x != 0) camX += x;
    if (y != 0) camY += y;
    if (z != 0) camZ += z;

    // Checking if any of the three variables are not zero, and performing the code below.
    if (x != 0 | y != 0 | z != 0) {
        D3DXMatrixTranslation(&w, camX, camY, camZ);
    }
}

在具有 vector.size() 的条件下运行 for.. 循环是否会强制应用程序在每个循环中重新计算 vector 中的元素?

std::vector<UINT> vect;

INT vectorSize = vect.size();
for (INT Index = 0; Index < vectorSize; Index++) {
// Do vector processing
}

// versus:

std::vector<UINT> vect;

for (INT Index = 0; Index < vect.size(); Index++) {
// Do vector processing
}

我正在使用 Visual Studio,至于第二个问题,编译器似乎可以优化某些东西,但我不确定。

最佳答案

根据 vector 的实现,编译器可能理解也可能不理解大小没有改变。毕竟,您在循环内调用不同的 vector 函数,其中任何一个都可能改变大小。

由于 vector 是一个模板,所以编译器知道关于它的一切,所以如果它真的努力工作,它可以理解大小不会改变,但这可能工作量太大。

通常,你会想这样写:

for (size_t i = 0, size = vect.size(); i < size; ++i)
    ...

虽然我们在这里,但迭代器使用了类似的方法:

for (list<int>::iterator i = lst.begin(), end = lst.end(); i != end; ++i)
    ...

编辑:我错过了第一部分:

这是优化吗?

if (x != 0) camX += x;
if (y != 0) camY += y;
if (z != 0) camZ += z;

没有。首先,即使它们是 int,它也不是优化,因为当值可能大多数时候不为零时检查和分支是更多的工作。

其次,更重要的是,它们是 float 的。这意味着除了 you shouldn't directly compare them to 0 , 它们几乎从不完全等于 0。因此 if 99.9999% 为真。

同样适用于此:

if (x != 0 | y != 0 | z != 0)

但是在这种情况下,由于矩阵转换的成本可能很高,您可以这样做:

#define EPS 1e-6 /* epsilon */
if (x > EPS || x < -EPS || y > EPS || y < -EPS || z > EPS || z < -EPS)

现在是的,与矩阵乘法相比,这可能是一种优化。

另请注意,我使用了 || 如果例如从一开始就短路 x > EPS 为真(它不会计算其余部分) ,但使用 | 不会发生这种情况。

关于C++ 这是微优化的一种形式吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16283973/

相关文章:

C++:结构初始化和映射

c++ - 将 Sqrt(x) 计算为 x * InvSqrt(x) 在 Doom 3 BFG 代码中是否有意义?

performance - 使用 SIMD/AVX/SSE 进行树遍历

delphi - 如何将DivMod优化为10的常数除数

c++ - 无法使用自定义结构的属性

c++ - 绘制可以放大/缩小的声波

C++ Makefile 不编译依赖项/链接错误?

c++ - make_pair 如何隐式推断类型?

performance - 为什么jnz不算循环?

assembly - Z80:从栈顶复制到 HL