2012-09-13 78 views
0

我有興趣從一開始就編寫好的代碼,而不是稍後優化代碼。對不起,沒有提供基準我目前沒有工作場景。感謝您的關注!微優化 - 訪問遞歸成員時的編譯優化

FunctionY使用FunctionX的性能提升是多少?

關於這個問題已經有很多關於stackoverflow的討論,但我在如下所示訪問子成員(遞歸)的情況下存在疑問。編譯器(比如VS2008)會將FunctionX優化成類似FunctionY的東西嗎?

void FunctionX(Obj * pObj) 
{ 
    pObj->MemberQ->MemberW->MemberA.function1(); 
    pObj->MemberQ->MemberW->MemberA.function2(); 
    pObj->MemberQ->MemberW->MemberB.function1(); 
    pObj->MemberQ->MemberW->MemberB.function2(); 
    .. 
    pObj->MemberQ->MemberW->MemberZ.function1(); 
    pObj->MemberQ->MemberW->MemberZ.function2(); 
} 

void FunctionY(Obj * pObj) 
{ 
    W * localPtr = pObj->MemberQ->MemberW; 
    localPtr->MemberA.function1(); 
    localPtr->MemberA.function2(); 
    localPtr->MemberB.function1(); 
    localPtr->MemberB.function2(); 
    ... 
    localPtr->MemberZ.function1(); 
    localPtr->MemberZ.function2(); 
} 
+0

你是否已經對該代碼進行了簡介,看看它是否真的很慢? –

+0

「編寫好的代碼」和「優化」是兩個完全不同的東西,並不是相互排斥的。 –

回答

2

如果沒有部件指針的是揮發性的或指針易失性和你沒有operator ->在鏈兩者的功能是相同的過載對任何成員。 您所建議的優化規則被廣泛稱爲「常見表達式消除」,幾十年來得到絕大多數編譯器的支持。

+0

謝謝,通用表達式消除是指導我更有用的信息的術語。 –

+0

這。這兩個代碼示例不可能有任何不同。 –

1

理論上,你可以節省額外的指針解引用,但是在現實世界中,編譯器可能會爲你優化它,所以這是一個無用的優化。

這就是爲什麼首先進行配置文件,然後進行優化很重要。編譯器正在盡其所能幫助你,你也可以確保你不只是在做已經在做的事情。

+0

優化使良好的代碼變得糟糕。 「好代碼」很簡單,乾淨而且正確。只有在剖析器(和其他信息)告訴你需要優化的東西時,情況纔會變得更糟。 –

+0

@JonathanSeng好的代碼也必須是可讀的,在這種情況下聲明一個顯式變量會使代碼更容易閱讀和理解。 – UnknownGosu

+0

如果實際上通過類似的方式獲得了相當的性能(雖然在分析之後),但是函數更大並且'functionX'調用的地方更加分散。中間變量的結果是成員更頻繁地進入緩存。 –

0

如果編譯器足夠好,它應該將functionX轉換成類似於functionY的東西。 但是,您可以在不同的編譯器和具有不同優化標誌的相同編譯器上獲得不同的結果。 使用「啞」編譯器函數應該更快,恕我直言,它更可讀和更快的代碼。所以堅持使用功能Y

ps。你應該看看一些代碼風格指南,通常成員和函數名應該始終以小​​寫字母開頭

+0

Thanks!我只使用大寫字母來使它們與代碼的其他部分不同,以更好地反映我的問題。 –