2012-03-30 74 views
1

我想知道如果使用getter在循環中一遍又一遍地獲取相同的屬性有任何性能命中。我應該先將它保存到變量中嗎?請看下面的例子:

C++性能:在循環中使用getter或將其保存到變量首先

直接使用的getter:

for(int i=0; i<1000000; ++i) { 
    print("Phone = %d\n", myobj->getCity("Foo")->getPhone(i); 
} 



編輯:

怎麼樣的循環約束?

for(int i=0; i<myobj->totalPhoneNum(); ++i) {...} 

int totalPhoneNum = myobj->totalPhoneNum(); 
for(int i=0; i<totalPhoneNum; ++i) {...} 
+1

只有當getter的參數依賴於某個循環變量時,才應該在循環中使用getter。在你的情況下它是「不變的」,所以你應該把它保存到一個變量中。它會更好讀。 – dexametason 2012-03-30 09:37:17

+0

剛剛更新了我的問題,那麼循環約束呢?我認爲一行更具可讀性和乾淨性,但總的PhoneNum在這裏是一個常數。哪一個更可取? – Stan 2012-03-30 09:44:44

+1

如果您錯過了我對(現已刪除的)答案的評論,編譯器無法對其進行優化,除非它可以證明'totalPhoneNum()'是常量並且沒有副作用。如果這個功能甚至稍微不重要,那麼你可能最好手動將它拉出來。 – Mysticial 2012-03-30 09:47:39

回答

7

是的,你應該。無論它在性能上有什麼不同,它的語義更清晰。通過首先將它保存到一個變量中,表明它是一個循環不變量。

+0

假設它實際上是一個循環不變量,並且在循環過程中不能改變。 – Ben 2012-03-30 10:40:39

+0

@Jeff,我的問題中的第二個案例呢?聽起來像兩種方式沒有太大的區別(?)。 – Stan 2012-03-30 11:13:05

+0

同樣的說法適用。您不希望'myobj-> totalPhoneNum()'每次在循環周圍進行評估,因爲它是一個循環不變量。將其拉出到變量使得這更清晰。 – 2012-03-30 11:44:06

1

我建議你修改它像這樣檢查空

City* city = myobj->getCity("Foo"); 
if(city != NULL) 
{  
    for(int i=0; i<1000000; ++i) 
    { 
     print("Phone = %d\n", city ->getPhone(i); 
    } 
} 

,除非你是不是在幾個地方做myobj-> totalPhoneNum()是通過罰款這種方式來調用

相關問題