說你看到一個循環像這樣的:從緊密內部循環調用小函數的開銷? [C++]
for(int i=0;
i<thing.getParent().getObjectModel().getElements(SOME_TYPE).count();
++i)
{
thing.getData().insert(
thing.GetData().Count(),
thing.getParent().getObjectModel().getElements(SOME_TYPE)[i].getName()
);
}
如果這是Java的我可能會不三思而後行。但是在C++的性能關鍵部分,它使我想要修補它......但是我不知道編譯器是否足夠聰明以至於無用。 這是一個製作的例子,但它所做的只是將字符串插入到容器中。請不要假設任何這些是STL類型,請考慮以下一般性術語:
- 在for循環中每次或每次都會評估一個混亂的條件嗎?
- 如果這些get方法只是簡單地返回對象上成員變量的引用,它們是否會被內聯?
- 您是否期望定製[]運算符得到優化?
換句話說,是否值得將其轉換爲類似的時間(在性能上只,沒有可讀性):
ElementContainer &source =
thing.getParent().getObjectModel().getElements(SOME_TYPE);
int num = source.count();
Store &destination = thing.getData();
for(int i=0;i<num;++i)
{
destination.insert(thing.GetData().Count(), source[i].getName());
}
請記住,這是一個嚴密的循環,稱爲百萬次第二。我想知道的是,如果所有這些都會削減每個循環的幾個週期或更重要的東西?
是的我知道關於「過早優化」的引用。而且我知道分析很重要。但是這是關於現代編譯器,特別是Visual Studio的一個更普遍的問題。
我認爲它是無論如何都是有點代碼味道的(「消息鏈」),無論如何,它可能有意義做一些事情。 – UncleBens 2010-03-31 14:42:18
說這是一個「一般性問題」並不會改變這一事實,即這是另一次嘗試優化而無需分析。換句話說,這是一個徒勞無益的猜測。 – 2010-03-31 16:05:40
對不起,你錯了。如果你知道你在做什麼,你應該能夠告訴我這個代碼是否可以被明智地優化,無論花費多少時間。 – 2010-03-31 16:26:07