Mar*_*uss 2 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);
}
}
Run Code Online (Sandbox Code Playgroud)
使用带有vector.size()的条件运行for循环会强制应用程序重新计算每个循环中向量中的元素吗?
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
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Visual Studio,至于第二个问题,它似乎是编译器可以优化的东西,但我只是不确定.
根据向量的实现,编译器可能会或可能不会理解大小未更改.毕竟,你在循环中调用不同的向量函数,其中任何一个都可能改变大小.
由于vector是一个模板,然后编译器知道它的一切,所以如果它真的很难,它可以理解大小不会改变,但这可能太多了.
通常,你会想这样写:
for (size_t i = 0, size = vect.size(); i < size; ++i)
...
Run Code Online (Sandbox Code Playgroud)
虽然我们正在使用它,但迭代器使用了类似的方法:
for (list<int>::iterator i = lst.begin(), end = lst.end(); i != end; ++i)
...
Run Code Online (Sandbox Code Playgroud)
编辑:我错过了第一部分:
这是优化吗?
if (x != 0) camX += x;
if (y != 0) camY += y;
if (z != 0) camZ += z;
Run Code Online (Sandbox Code Playgroud)
首先,即使它们是int,也不是优化,因为检查和分支时值大概是大多数时间不是零是更多的工作.
其次,更重要的是,它们是浮动的.这意味着除了你不应该直接将它们与0比较的事实,它们基本上几乎不会完全等于0.所以ifs是99.9999%真.
同样的事情适用于此:
if (x != 0 | y != 0 | z != 0)
Run Code Online (Sandbox Code Playgroud)
但是,在这种情况下,由于矩阵转换成本很高,您可以:
#define EPS 1e-6 /* epsilon */
if (x > EPS || x < -EPS || y > EPS || y < -EPS || z > EPS || z < -EPS)
Run Code Online (Sandbox Code Playgroud)
现在是的,与矩阵乘法相比,这可能是一种优化.
还要注意我使用的||是短路,如果例如从开头x > EPS就是真的(它不会计算其余部分),但是|不会发生这种情况.
| 归档时间: |
|
| 查看次数: |
261 次 |
| 最近记录: |