2010-08-04 28 views
5

在C#中,比較以下THREE替代方案時性能是否會有差異?會在子塊內聲明變量提高性能嗎?

ONE

void ONE(int x) { 

if (x == 10) 
{ 
    int y = 20; 
    int z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

void TWO(int x) { 

int y; 
int z; 

if (x == 10) 
{ 
    y = 20; 
    z = 30; 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 

void THREE(int x) { 

int y = 20; 
int z = 30; 

if (x == 10) 
{ 
    // do other stuff 
} else { 
    // do other stuff 
} 
} 
+3

你正在擔心被稱爲「微觀優化」的問題:你有沒有基準確定你確實存在性能問題? – 2010-08-04 03:18:59

+0

@Mitch:我在克雷格的帖子中看不到任何地方抱怨他的代碼性能下降。他有一個完全有效和聰明的問題要問,所以他做到了。這就像我們不能發佈任何涉及性能的@SO。 – 2010-08-04 03:41:21

+2

我甚至不會將這種微型優化稱爲納米優化。任何看過探查器輸出的人都知道,擔心存儲變量或調用函數所花的時間可以忽略不計。 – 2010-08-04 03:46:06

回答

4

所有其他條件相同(他們通常都沒有,這就是爲什麼你通常要實際測試它),ONE()TWO()因爲局部變量最終作用域是應該產生相同的IL指令整個方法。 THREE()將是可忽略如果x==10較慢,因爲其他兩個不會費心地存儲在局部變量的值。

所有三個都佔用相同數量的內存 - 即使沒有存儲任何變量,也會分配所有變量的內存。 JIT編譯器可以在這裏執行優化,但是,如果它查找未使用的變量。

+0

+1和1生成相同的IL。 C#/ CLR中的方法級別範圍是一種狡猾的行爲,特別是對於C++程序員。 – 2010-08-04 03:47:55

+0

當x!= 10時編譯器仍然會在選項ONE中分配內存嗎? – CJ7 2010-08-04 05:24:03

+0

@Craig,是的,它會 - 因爲沒有辦法知道x!= 10,直到在函數調用設置完成後(包括爲變量分配內存)對它進行實際評估。 – 2010-08-04 23:24:18

1

有沒有性能上的差異,但你去以找出每個示例之間的變量範圍問題。

你也呈現出這些例子之間的三個不同的意圖,這是不是你想要的東西:

  1. y和z被限制在if語句的範圍。

  2. y和z在if語句之外使用,但是有條件地設置。

  3. y和z與if語句無關。

+0

爲什麼沒有性能差異? – CJ7 2010-08-04 03:58:06

0

我認爲這不會有太大的區別。唯一需要擔心的是如果創建新對象並初始化它很昂貴。您總是可以嘗試對每種方法進行幾千次簡介,看看是否有任何差異,但我懷疑您會找到任何差異。

我只將聲明從使用位置移開的唯一時間是它是否會在循環中進行處理。例如:

void RunMethod() { 
    FormRepresentation formRep = null; 
    for (int idx = 0; idx < 10; idx++) { 
    formRep = new FormRepresentation(); 
    // do something 
    } 
} 

它實際上沒有什麼區別,因爲對象仍在創建中,但對我而言,它看起來更乾淨。您需要考慮的另一件事是變量的範圍。聲明的變量不能用於他們聲明的範圍之外。

1

當然,你應該總是選擇ONE,它更可讀。速度提高几納秒不是偶然,通常是可讀的代碼。