2013-03-04 43 views
0

如果我想清楚了很多對象的特定布爾變量,以及這些對象之一應該得到這個變量設置之後,什麼是最有效的:如何最好地清除很多對象中的變量?

  • 迭代的所有對象,只是設置了var = FALSE
  • 迭代的所有對象,檢查var和設置它爲false的是,當一個真正的
class Foo { 
    boolean bar; //false for most objects 
} 

然後,使用:

for (Foo foo : fooList) { 
    foo.setBar(false); 
} 

或:

for (Foo foo : fooList) { 
    if (foo.isBar()) { 
     foo.setBar(false); 
    } 
} 

然後設置一個富:

singleFoo.setBar(true); 

大概節省時間是次要的這兩種方案。但是我無法測量這個atm,所以我會對你更好的方法感興趣嗎?

+2

這將很大程度上取決於你需要什麼。順便說一下,這是微型優化,它是萬惡的根源。 – 2013-03-04 16:22:33

+0

我同意@LuiggiMendoza。如果這是一些渲染循環中的某些重要代碼不夠好,那麼可以在一些示例應用程序中嘗試並測量差異。但是,如果您的代碼庫經過優化,以至於這是最大的問題,那麼生活就是好的。 – 2013-03-04 16:25:16

+0

在應用程序的整個生命週期中節省的時間將少於鍵入此答案的時間。 – millimoose 2013-03-04 16:51:25

回答

2

我不知道你想要做什麼,正如你所說,時間的差異將是微小的,即不可檢測。,但答案很簡單:只更改值可能會是「更快」和,由整流罩說,更易於閱讀,因此,您應該去:

for (Foo foo : fooList) { 
    foo.setBar(false); 
} 

解釋一點:

我假設你想在其他程序中計算未來的效率,所以我會建議你計算最好,最差和平均情況。在這種情況下,如果您必須更改所有布爾值或只是幾個布爾值,則可以計算每條語句需要花費多少時間。

例如,你可以說foo.setBar(false)需要A時間和if (foo.isBar())將採取B時間。

比方說,你只有3 foosfoolist,你可以遇到以下情況:

  • 最壞的情況:您在所有3 foos改變bar
  • 平均值:有時需要更改大多數條形的1或2。
  • 最好的情況:沒有酒吧需要改變。

只做A你會爲所有3個總宗的3A時間執行。 如果用if做到這一點,將需要:

  • 最壞的情況: 3A + 3B
  • 平均:(1-2)A + 3B
  • 最好的情況: 3B

如果我們假設B < A那麼if選項只會在第三種情況下更快。如果B<<A那麼平均值會更好。但是最糟糕的情況總是比完成任務更糟糕。在這種情況下,可能A和B的將是類似或相同這樣你纔會有(A = B):

  • 最壞的情況: 6A
  • 平均情況:(4-5 )甲
  • 最好的情況: 3A

所以,第一個選項(在開始時示出)將是最好的。

這對您所面臨的任何其他語言或性能問題都很有用。雖然如果你想要的話,你可以查看官方Java docs來檢查是否有特殊的VM改進。

1

將它們全部設置爲false,然後將其中一個設置爲true。在分支預測方面有一篇很棒的文章,我會找到它。

Why is it faster to process a sorted array than an unsorted array?

如果你有一個大組簡單對象的if語句可能會成爲一個巨大的瓶頸。很難說它有多重要,因爲如果添加支票取決於將設置多少個對象。

5

我不確定編譯器是否會將這兩個例子調平。但是,如果這對你來說是一個性能瓶頸,我會很驚訝。

只要使用此:

for (Foo foo : fooList) { 
    foo.setBar(false); 
} 

由於其易於閱讀

0

這是更好的方法

for (Foo foo : fooList) { 
    foo.setBar(false); 
} 

因爲它更清晰,而且到時候你會從不寫保存和例如,你可以花費很少的代碼來搞亂實際上速度較慢的代碼。

0

最「有效」的方法是將它們都設置爲false(您的第一個選項)。第二個需要兩個方法調用,而不是一個。當然,效率的差異幾乎肯定是無關緊要的。如果您有任何理由想知道(或記錄)在被設置爲false之前誰是錯誤的,那麼後面的方法顯然是要走的路。

0

你說的是JIT編譯器級優化。編寫代碼時不應該考慮它們。優化之前,首先進行配置。並從最慢的地方開始優化,然後下降。