将不同号码types作为参数发送到方法时是否存在性能问题?

鉴于这个function:

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

如果我发送不同的号码数据types,是否有性能问题? 例如:

 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如何pipe理这个? 它做拳击拆箱? 这会影响性能?

您的确切示例将由编译器进行转换,因此不存在性能损失。 如果我们修改一下这个例子:

 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 ,这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) { // ... }