冗余的通用类型参数会影响性能吗?

时间:2018-07-12 22:56:16

标签: c# performance generics methods

我有一个方法,使用了从未使用过的泛型:

public struct dummy {}

public static int DoSomething<T1,T2,T3>(int someParameter, T1 a1 = default, T2 a2 = default, T3 a3 = default)
{
    someParameter += 4;
    return someParameter;
}

public static void Main()
{
    var r1 = DoSomething<decimal, decimal, decimal>(5);
    var r2 = DoSomething<dummy, dummy, dummy>(12);
}

任何DoSomething方法调用都存在性能问题吗?

3 个答案:

答案 0 :(得分:3)

该方法将对任何引用类型进行一次JITed处理-然后可以将该代码重新用作作为泛型类型参数传递的任何以后的引用类型。

对于值类型,每种新类型的方法都必须再次JIT。

因此,当您第一次传递引用类型,然后再传递每种不同的值类型时,将会降低性能成本。

因此,要回答您的特定问题,是否使用类型参数都无关紧要-每次使用新的值类型调用方法时,都会产生少量费用。如果您完全摆脱了通用参数,那么该方法将只能被JIT一次。

答案 1 :(得分:0)

方法中的泛型没有可识别的(即使是大规模的)影响。

不过,我认为更大的问题是您首先拥有未使用的泛型。

答案 2 :(得分:0)

通常,与使用泛型的每个值类型相比,JITting的开销很小(如@RagtimeWilly所述),泛型通常比等效的泛型代码(通常将对象参数用于多态性)。您无需支付将值类型装箱和拆箱到具有泛型的装箱对象中的费用。

但是,除了让“嘿,泛型不只是很酷,它们很快”之外,这在现实世界中是非常无用的信息。

如果您是这样想的,那么您就在进行过早的微优化。考虑编写好的代码。在弄清楚那是什么之后,以正确的方式使用指尖的工具(例如,仿制药,lamda等)。