将不同的数字类型作为参数发送到方法是否存在性能问题
本文关键字:方法 是否 存在 问题 性能 参数 数字 类型 | 更新日期: 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)
{
// ...
}