Mik*_*zur 5 c# generics mono performance boxing
我有一个C#接口,其中某些方法参数声明为object
类型.但是,传递的实际类型可能因实现接口的类而异:
public interface IMyInterface
{
void MyMethod(object arg);
}
public class MyClass1 : IMyInterface
{
public void MyMethod(object arg)
{
MyObject obj = (MyObject) arg;
// do something with obj...
}
}
public class MyClass2 : IMyInterface
{
public void MyMethod(object arg)
{
byte[] obj = (byte[]) arg;
// do something with obj...
}
}
Run Code Online (Sandbox Code Playgroud)
MyClass2的问题在于转换byte[]
和转换object
是装箱和拆箱,这是影响性能的计算上昂贵的操作.
用通用接口解决这个问题会避免装箱/拆箱吗?
public interface IMyInterface<T>
{
void MyMethod(T arg);
}
public class MyClass1 : IMyInterface<MyObject>
{
public void MyMethod(MyObject arg)
{
// typecast no longer necessary
//MyObject obj = (MyObject) arg;
// do something with arg...
}
}
public class MyClass2 : IMyInterface<byte[]>
{
public void MyMethod(byte[] arg)
{
// typecast no longer necessary
//byte[] obj = (byte[]) arg;
// do something with arg...
}
}
Run Code Online (Sandbox Code Playgroud)
这是如何在.NET vs Mono中实现的?这两个平台都会有任何性能影响吗?
谢谢!
lep*_*pie 11
MyClass2的问题在于byte []与对象的转换是装箱和拆箱,这是影响性能的计算上昂贵的操作.
数组类型不涉及装箱,即使是具有值类型元素的装箱也是如此.数组是引用类型.
(byte [])arg的开销最多是最小的.
我不确定它是如何在单声道中实现的,但是通用接口将有所帮助,因为编译器为每个使用的不同类型创建特定类型的新函数(在内部,在一些情况下,它可以使用相同的生成函数) .如果生成特定类型的函数,则无需对该类型进行装箱/取消装箱.
这就是Collections.Generic库在.NET 2.0中受到重创的原因,因为集合不再需要装箱而且效率明显提高.
归档时间: |
|
查看次数: |
5538 次 |
最近记录: |