我有這樣一個簡單的嵌套結構。 (這是簡化的實際問題的版本他們中的一些實際使用的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 ...'和其他所有人來說,會是什麼? –
這意味着你只有相同的結構數據(包裝在不同的類中)。但是所有這些數據都是相互嵌套的。現在取決於一個標誌變量說類型,你需要在不同的水平上執行不同的操作。但是對於單一類型,您需要針對特定級別執行特定操作,而不是其他級別的權限? –