Sam*_*rsa 1 c++ micro-optimization
我用一个unsigned char存储8个标志.每个标志代表一个立方体的角落.所以00000001角落1 01000100将是角落3和7等.我当前的解决方案是&1,2,4,8,16,32,64和128的结果,检查结果是否为零并存储角落.就是这样if (result & 1) corners.push_back(1);.我有机会摆脱那个"如果"的陈述吗?我希望我可以通过按位运算符摆脱它,但我想不出任何.
关于为什么我要摆脱if语句的一些背景知识.这个立方体实际上是一个体素,它是网格的一部分,其大小至少为512x512x512.这超过1.34亿体素.我正在对每个体素进行计算(嗯,不完全是,但我不会详细介绍,因为这里不相关),这是很多计算.我需要每帧执行这些计算.每个函数调用的任何速度提升都是微不足道的,这将有助于这些计算量.为了给你一个想法,我的算法(在某些时候)需要确定浮点数是负数,正数还是零(在某些错误内).我在那里有if语句,比检查更大/更小.我用快速浮点数转换为int函数并将其削减了四分之一秒.目前,128x128x128网格中的每个帧需要4秒多一点.
我会完全考虑一种不同的方法:不同的标志组合只有256种可能性.预先计算256个向量并根据需要将其索引.
std::vector<std::vector<int> > corners(256);
for (int i = 0; i < 256; ++i) {
std::vector<int>& v = corners[i];
if (i & 1) v.push_back(1);
if (i & 2) v.push_back(2);
if (i & 4) v.push_back(4);
if (i & 8) v.push_back(8);
if (i & 16) v.push_back(16);
if (i & 32) v.push_back(32);
if (i & 64) v.push_back(64);
if (i & 128) v.push_back(128);
}
for (int i = 0; i < NumVoxels(); ++i) {
unsigned char flags = GetFlags(i);
const std::vector& v = corners[flags];
... // do whatever with v
}
Run Code Online (Sandbox Code Playgroud)
这将避免所有的条件和 push_back调用new,我怀疑它会更昂贵.