Int32.CompareTo(int x)性能

Rob*_*Rob 9 c# performance boxing

以下是否有任何性能问题(例如执行拳击)?

public int CompareIntValues(int left, int right)
{
    return left.CompareTo(right);
}
Run Code Online (Sandbox Code Playgroud)

一些进一步的信息 该应用程序应该是软实时的,因此使用C#可能是一个奇怪的选择.但是,那不在我手中.

dle*_*lev 12

这是每个人最喜欢的游戏节目的时间:BOX或NO BOX!

public string DoIntToString(int anInt)
{
    return anInt.ToString();
}
Run Code Online (Sandbox Code Playgroud)

BOXNO BOX?我们去IL吧:

IL_0001: ldarga.s anInt
IL_0003: call instance string [mscorlib]System.Int32::ToString()
Run Code Online (Sandbox Code Playgroud)

没有盒子.ToString()是一种virtual上的方法object,其通过重写int.由于structs不能参与非接口继承,编译器知道没有子类int,并且可以直接生成对该int版本的调用ToString().


static Type DoIntGetType(int anInt)
{
    return anInt.GetType();
}
Run Code Online (Sandbox Code Playgroud)

BOXNO BOX?我们去IL吧:

IL_0001: ldarg.0
IL_0002: box [mscorlib]System.Int32
IL_0007: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
Run Code Online (Sandbox Code Playgroud)

BOX.GetType()不是 virtualobject,所以没有int版本的方法.必须将参数加框,并在新的盒装对象上进行调用.


private static string DoIntToStringIFormattable(int anInt)
{
    return anInt.ToString(CultureInfo.CurrentCulture);
}
Run Code Online (Sandbox Code Playgroud)

BOXNO BOX?我们去IL吧:

IL_0001: ldarga.s anInt
IL_0003: call class [mscorlib]System.Globalization.CultureInfo [mscorlib]System.Globalization.CultureInfo::get_CurrentCulture()
IL_0008: call instance string [mscorlib]System.Int32::ToString(class [mscorlib]System.IFormatProvider)
Run Code Online (Sandbox Code Playgroud)

没有盒子.即使ToString(IFormattable)IFormatProvider接口的实现,调用本身也是直接针对int.出于与第一种方法相同的原因,不需要任何方框.


所以对于最后一轮,我们有你的方法:

public int CompareIntValues(int left, int right)
{
    return left.CompareTo(right);
}
Run Code Online (Sandbox Code Playgroud)

知道这CompareTo(int)是隐式实现IComparable<int>,你打电话:BOXNO BOX

  • 拳击也是如此吗? (2认同)

Cod*_*ked 6

由于Int32为CompareTo定义了两个重载,一个拿一个int和一个需要一个的重载,所以不会有任何拳击object.在上面的示例中,将调用前者.如果必须调用后者,则会发生装箱.