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)
BOX或NO 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)
BOX或NO 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()是不是 virtual在object,所以没有int版本的方法.必须将参数加框,并在新的盒装对象上进行调用.
private static string DoIntToStringIFormattable(int anInt)
{
return anInt.ToString(CultureInfo.CurrentCulture);
}
Run Code Online (Sandbox Code Playgroud)
BOX或NO 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>,你打电话:BOX或NO BOX?