簡體   English   中英

將最可能的真實條件放在if,else-if或else中有什么不同

[英]What is the different in putting most possible true condition in if, else-if or else

將最可能的條件放在if,else-if或else條件中是否有任何區別

例如:

int[] a = {2,4,6,9,10,0,30,0,31,66}
int firstCase = 0, secondCase = 0, thirdCase = 0;
for( int i=0;i<10;i++ ){
    int m = a[i] % 5;
    if(m < 3) {
        firstCase++;
    } else if(m == 3) {
        secondCase++;
    } else {
        thirdCase++;
    }
}

執行時間與輸入的區別是什么

int[] a = {3,6,8,7,0,0,0,0,0,0}

在if,else-if或else條件中是否存在任何不同的最大可能真實條件

實際上,Java的答案是“它取決於”。

您可以看到,當您運行Java代碼時,JVM會在收集統計信息時使用解釋器啟動。 可以記錄的統計之一是最常采用分支指令中的哪些路徑。 然后,JIT編譯器可以使用這些統計信息來影響代碼重新排序,這不會改變編譯代碼的語義。

因此,如果您要使用兩個不同的數據集(即“大多數為零”和“大多數非零”)執行代碼,則JIT編譯器可能會以不同方式編譯代碼。

它是否能夠實際進行此優化取決於它是否能夠確定重新排序是否有效。 例如,它可以推斷出被測試的條件是互斥的嗎?


那么這會如何影響復雜性呢? 好吧......讓我們為簡化的例子做總結,假設JIT編譯器沒有做任何“智能”的事情。 並假設我們不只是處理長度為10的數組(這使得復雜性的討論沒有實際意義)。

考慮一下:

  • 對於每個零,循環執行一次測試和一次增量 - 比如說2次操作。

  • 對於每個非零元素,循環執行兩個測試和一個增量 - 比如說3個操作。

因此,當所有零對3 * N操作都是非零時,對於N個元素大約是2 * N個操作。 但兩者都是O(N) ......所以Big O的復雜性不受影響。

(好吧,我留下了一些東西......但是你得到了圖片。其中一個案例會更快,但復雜性不受影響。)

除了你被告知之外,還有更多的東西。

  1. 'if'與'else':如果一個條件及其反轉不太可能,你應該處理'else'塊中更可能的條件,而不是'if'塊。 'if'塊需要一個未被采用的條件跳轉和一個圍繞'else'塊的最終分支; 'else'塊需要一個條件分支,並且根本沒有最終分支。

  2. 'if'與'else if'對'else':顯然你應該處理'if'塊中最常見的情況,以避免第二次測試。 與(1)中相同的考慮因素確定最終'else if'和最終'else'之間的更常見情況應該在最終的'else'塊中處理。

說了這么多,除非測試是非平凡的,或者所有這些塊的內容都是微不足道的,否則任何一個塊都不太可能產生明顯的差異。

如果您只有if-else ,則沒有區別,因為條件將始終被評估,並且它是否幾乎總是真或假並不重要。 但是,如果你在else部分中有一個ifelse if ),那么在第一個if放置最可能的真實條件要好得多。 因此,大多數時候您不需要評估else內部的條件,從而提高性能。

如果大多數條件為真,那么執行時間將會更短。因為在第一個if條件下只滿足它。

如果if-else中的大多數條件都為真,則執行時間將小於最后一個且超過第一個方案。

如果大多數條件在else中都為真,則執行時間將更長。因為它檢查前兩個條件。

當然是啦。

if ... else if ...檢查按照編碼的順序進行。 因此,如果您將最大可能的條件放在此條件檢查隊列的末尾 - 這樣的代碼將稍微慢一些。

但這一切都決定了這些條件的構建方式(它們有多復雜)。

最可能的條件應該是if和then if else等等。

在第一級寫出最常見的條件是好的,這樣如果條件為真或假,將在較短的時間內首先處理。

如果將最常見的條件放在middle(else..if)或last(else)中,則需要時間才能達到該條件語句,因為它需要檢查每個條件語句。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM