将不同的数字类型作为参数发送到方法是否存在性能问题

本文关键字:方法 是否 存在 问题 性能 参数 数字 类型 | 更新日期: 2023-09-27 17:57:24

给定此函数:

void function(Double X, Double y, Double Z);

如果我发送不同的数字数据类型,是否存在性能问题?例如:

function(1, 2, 3); //int, int, int
function(1, 2.2, 1); //int, double, int
function(1.3f, 3.4, 2.34f) //single, double, single
function(1.2f, 1, 1) //single, int, int

.NET JIT 如何管理这一点?它做装箱拆箱?这会影响性能?

将不同的数字类型作为参数发送到方法是否存在性能问题

您的确切示例将由编译器转换,因此不会降低性能。 如果我们稍微修改一下示例:

static void Test(double x, double y, double z)
{
    Console.WriteLine(x * y * z);
}
static void Main()
{
    double d1 = 1;
    double d2 = 2;
    double d3 = 3;
    float f1 = 1;
    float f2 = 2;
    float f3 = 3;
    int i1 = 1;
    int i2 = 2;
    int i3 = 3;
    Test(i1, i2, i3);
    Test(i1, d2, i3);
    Test(f1, d2, f3);
    Test(f1, i2, i3);
}

然后故事就不同了。 编译器不太可能为我们进行转换,因此它有必要向转换发出代码,例如,让我们看一下第二次调用的代码Test

IL_004b:  ldloc.s    V_6    // Load the variable i1 onto the stack
IL_004d:  conv.r8           // Convert it to a double
IL_004e:  ldloc.1           // Load the variable d2 onto the stack
IL_004f:  ldloc.s    V_8    // Load the variable i3 onto the stack
IL_0051:  conv.r8           // Convert it to a double
// And call the function:
IL_0052:  call       void Example.ExampleClass::Test(float64,
                                                   float64,
                                                   float64)

您可以看到它必须为两个非双精度分别发出一条指令。 这不是一个免费的操作,需要时间来计算。

综上所述,我很难想象这很重要,除非你在非常紧密的循环中调用这个函数。

编辑

另外,请留意属性访问器。 例如,如果演示对象在 for 循环期间不更改其长度,则这两种方法在逻辑上是相同的,但第一个方法将多次调用demo.Length,这肯定比调用一次慢。

var demo = CreateDemo();
for (int i = 0; i < demo.Length; ++i)
{
    // ...
}
// .. vs ..
var demo = CreateDemo();
int len = demo.Length;
for (int i = 0; i < len; ++i)
{
    // ...
}