2012-08-11 65 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