这是微优化,还是根本就是优化?
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/