2012-08-11 63 views
1

所以我讀這篇文章C# Overloads它說,你可以使用重載的方法來消除複雜性和提高性能,他們提供了下面的例子:C# - 重載性能增強的查詢

使用系統;

class Program 
{ 
    public static void Main() 
    { 
    ShowString(string.Empty); 
    ShowString("Category"); 
    } 

    static void ShowString(string value) 
    { 
    if (value == string.Empty) 
    { 
     Console.WriteLine("Popular"); 
    } 
    else 
    { 
     Console.WriteLine(value); 
    } 
    } 
} 

他們然後使用重寫重載:

using System; 

class Program 
{ 
    public static void Main() 
    { 
    ShowString(); 
    ShowString("Category"); 
    } 

    static void ShowString() 
    { 
    // Send default argument to overload. 
    ShowString("Popular"); 
    } 

    static void ShowString(string value) 
    { 
    // We don't need an if check here, which makes 
    // ... calling this method directly faster. 
    Console.WriteLine(value); 
    } 
} 

會使用重載變體比使用方法與默認參數值提供更好的性能?

像:

using System; 

class Program 
{ 
    public static void Main() 
    { 
    ShowString(); 
    ShowString("Category"); 
    } 

    static void ShowString(string value = "Popular") 
    { 
    // We don't need an if check here, which makes 
    // ... calling this method directly faster. 
    Console.WriteLine(value); 
    } 
} 

或是代碼的最後塊的代碼的第一個塊的等效?

+0

性能是很少用於語言特徵的度量。 – 2012-08-11 13:12:13

回答

2

不,默認參數是至少快過載,因爲你的最後一個例子編譯爲:

.... 
ShowString("Popular"); 
ShowString("Category"); 
.... 

你的第二個例子(使用重載)將(如果專爲發佈而不是調試)可能被內聯在運行時,性能將與最後一個示例(默認參數)相同。

這個例子有點愚蠢,因爲value == string.Empty的成本幾乎沒有什麼,但我想它是用來說明這一點。但是,這可能是您應該從這個答案中選擇的最重要的一點:在提前優化之前,您應該始終選擇更清晰/更易維護的代碼,因此可用性應該成爲決定在特定情況下應該使用什麼的首要因素。

+0

感謝您的信息和建議! – IneedHelp 2012-08-11 12:33:22

2

重載不一定是關於性能。在這種情況下,差異很小;無參數的版本是:

call, ldstr, call 

用參數是(包括默認參數版本,不管是否指定的值)的版本:

ldstr, call, ldarg_0, call 

然而,這將不會影響性能;唯一與這裏的性能相關的是調用控制檯,這比其他任何東西都要慢很多,比多了

又名:不要擔心它,除非你認爲有一個實際問題。

當特定方法允許優化版本時,重載更有用,例如刪除裝箱。

+0

謝謝您的信息。 – IneedHelp 2012-08-11 12:33:40