我有这样一个简单的嵌套结构。 (这是简化的实际问题的版本他们中的一些实际使用的hash_set。)Java:通过大量半常数标志检查来优化循环循环?
class A{ AF a_field; B[] bs;}
class B{ BF b_field; C[] cs;}
class C{ CF c_field; D[] ds;}
class D{ DF d_field; }
static A[] as; // loosely speaking, it has about 4000 D
一个伪码法“F”看起来可能是复杂的,但它是很容易理解: -
int f(int TYPE){ //TYPE is 0 - 40
int retur=0;
for(int n=0;n<as.length;n++){
. if(some cheap condition of TYPE){ //use only "TYPE" , cheap (1)
. . as[n].a_field.doExpensiveAA(); //expensive OPERATION, use only "a_field" (Ex retur+=a_field)
. }else if(some cheap condition of TYPE){ //use only "TYPE" (2)
. . as[n].a_field.doExpensiveAB(); //expensive OPERATION, use only "a_field" (Ex retur-=a_field)
. } // .... and a lot of them
. for(int m=0;m<bs.length;m++){
. . if(some cheap condition of TYPE){ //use only "TYPE" (3)
. . . as[n].bs[m].b_field.doExpensiveBA(); (*)//use only "b_field"
. . }else if(some cheap condition of TYPE){//use only "TYPE" (4)
. . . as[n].bs[m].b_field.doExpensiveBB(); (/) //use only "b_field"
. . } // .... and a lot of them
. . for(..cs ..){...for(...ds...) {...}...}
. }
}
}
(我拼命地添加缩进。)
“f” 被称为在每个时间步长: -
public static void caller(){
for(int n=0;n<40;n++){ f(n); }
}
请注意,TYPE只是用于条件检查的变量,对于单个“f”调用而言它是不变的。
虽然每个条件检查确实很便宜,但是当它位于最内层循环时,它会花费很多CPU周期。如何优化“呼叫者”和/或“F”?
我的想法是
展开“F”为每一个“类型”,但会有很多肮脏的代码是很难维持......这样......
(); f2(); f3(); f1(); f2(); f3(); f1(); f2(); f3(); ... f40(); }使用开关盒!它比if-else更快,但是0到40的开关箱很丑。条件不能像“检查TYPE的奇数/偶数”那样分组,因此代码的可维护性较低。
编辑1(应答帕塔Sarathi戈什):检查位只是例子,所以位的指标是不重要的,它甚至可以“> 8”,只是要注意,所有的条件是依赖于类型。
编辑2:+ - * /只是一个例子,它是一个使用a_field,b_field等的任意函数(真实情况是在Opengl中设置3D纹理或系统变量)... cs。 ..和... ds ...是类似但不同的昂贵操作。
编辑3:添加信息 “A []为” 包含有关4000 d
编辑4(回答帕塔Sarathi戈什):从int编辑xxx_field的类型,以显示它们是不同的类。
在第二个for循环使用的内部使用了'if(“TYPE的最后一位是1”)和'else if(“TYPE的第二个最后一位是0”)是否有任何错误? –
而且,您还将'...... as ......'用作'retur + = as [n] .a_field'和'retur * = as [n] .a_field'。但'retur- = as [n] .bs [m] .b_field'和'retur/= as [n] .bs [m] .b_field'为'... bs ...'。那么对于'..cs ...'和其他所有人来说,会是什么? –
这意味着你只有相同的结构数据(包装在不同的类中)。但是所有这些数据都是相互嵌套的。现在取决于一个标志变量说类型,你需要在不同的水平上执行不同的操作。但是对于单一类型,您需要针对特定级别执行特定操作,而不是其他级别的权限? –