2014年2月7日 星期五

【JAVA】if...else if...else...判斷式,怎樣寫效能才會好?

「if」怎麼使用?

寫這個未免也太娘太小家子氣太學生口味了!(沒有瞧不起人的意思,感謝網路上無數的教學網站和教學文,但...你們還有需要加強的地方。)

參考一下我以前測試「效能」的方法,現在用來測下面這兩種「if」寫法在執行上會有多少效能差異......

IF1


IF2

上圖稱為IF1,下圖稱為IF2。因為我用個三層式的for迴圈來進行測試,所以會有i/j/k三個數值出現。

c1/c2的型態為long。看看他們被遞增的if條件式......是完全一樣的!也就是說如果c1被遞增、c2也會被遞增。唯一的差異就在於if...else的執行順序而已。

就理論上來說,「if」會被逐一執行,也就是說如果第一行if的條件吻合,則剩下的if都不會被執行,即使有條件更嚴謹、更精確、更穩和的。也就是說,理論上IF1執行起來會比較慢。

但另一個真正的問題是......要做if判斷,會需要耗掉多少資源。(沒辦法精準測量,只能取個概念。)

測試結果的彈性變化差異很大。



i/j/k的遞增極限都是1200,──k遞增到1200時會歸零,然後把j遞增1,j遞增到1200時也會歸零,然後把i遞增1......直到i也是1200,這個迴圈宣告結束。

limit1的值越小,IF1被執行到最後一行的機率就越高,理論上來說消耗的資源也越高。

當我把limit1定在400時,IF1執行完花了1769millisecond,IF2只花了836。

但當我把limit1定在800時,IF1執行完花了372millisecond,IF2只花了252。

當我再把limit1定在1000時,IF1執行完花了101millisecond,IF2只花了79。

最後但當我把limit1定在1200時,IF1執行完花了27millisecond,IF2只花了16。



這結果挺詭異的...我沒預想到,其實應該只要專注在小於800的數字就好。我擔心IF的條件太少會失去意義,但顯然我的IF條件太多...但又不夠多!(所以當limit1設在1200時,兩者的執行效率沒辦法達到一樣,因為我沒有精確的把所有i/j/k的狀況列入。)

可是結果肯定有差.......

如果寫了一長串的「if...else...」判斷式,然後又把常用的都擺在最後頭,程式的效能差異可以到達兩倍之多。(還沒有嘗試增加判斷式的難度會有何差別,那雖然不難.....但細節很多。)



這不單單只是效能測試而已!

程式碼光是簡潔還不夠,判斷式光是正確還不夠.......因為我們沒辦法預料這自己寫的判斷式會碰到什麼樣的資料/數據。我們沒辦法精準的保證「自己最前頭的判斷條件一定會被優先執行」。



所以會有使用函數並搭配return來控制函數執行的需要。不過這是改天再寫的了。

(但如果是我,我會用物件的多型性來取代這一長串判斷式。這有機會再寫的了。



點這是看續篇.......(我怎麼這麼無聊,連這種東西都寫續篇。)

沒有留言:

張貼留言