C# - 重载性能增强查询

时间:2012-08-11 12:15:52

标签: c# performance overloading

所以我读过这篇文章C# Overloads,它说你可以使用重载方法来消除复杂性并提高性能,它们提供了以下示例:

使用System;

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);
    }
}

或者是最后一段代码,相当于第一块代码?

2 个答案:

答案 0 :(得分:2)

重载不一定与性能有关。在这种情况下,差异很小;无参数版本是:

call, ldstr, call

带参数的版本是(包括默认参数版本,无论是否指定了值):

ldstr, call, ldarg_0, call

但是,这不会影响性能;唯一与性能相关的是调用控制台,这比其他任何东西都 慢。

阿卡:除非你认为存在实际问题,否则不要担心。

当特定方法允许优化版本时,重载更有用,例如删除装箱。

答案 1 :(得分:2)

不,默认参数至少与重载一样快,因为您的上一个示例编译为:

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

您的第二个示例(使用重载)(如果为Release而不是Debug构建)可能会在运行时内联,以便性能与上一个示例(默认参数)相同。

这个例子有点愚蠢,因为value == string.Empty的成本实际上没什么,但我认为这有助于说明这一点。但是,这可能是你应该从这个答案中得到的最重要的一点:在过早优化之前你应该总是寻求更清晰/更易于维护的代码,因此可用性应该是决定你应该做什么的最重要因素在特定情况下使用。