WEB开发网
开发学院软件开发C语言 Effecitve C# 原则46:最小化与其它非托管代码的交... 阅读

Effecitve C# 原则46:最小化与其它非托管代码的交互

 2009-02-19 08:17:24 来源:WEB开发网   
核心提示: System.ByteSystem.SByteSystem.Int16System.UInt16System.Int32System.UInt32System.Int64System.UInt64System.UIntPtr另外,任何的blittable类型的一维数组也是blittable

System.Byte
System.SByte
System.Int16
System.UInt16
System.Int32
System.UInt32
System.Int64
System.UInt64
System.UIntPtr

另外,任何的blittable类型的一维数组也是blittable类型。最后,任何格式化的包含blittable类型的也是blittable类型。一个格式化的类型可以是一个用StructLayoutAttribute明确定义了数据层次的结构,

[ StructLayout( LayoutKind.Sequential ) ]
public struct Point3D
{
 public int X;
 public int Y;
 public int Z;
}

当你在托管代码和非托管代码之间,只使用blittable 类型时,你就最小化了多少必须拷贝的信息呀!你同样也优化了任何必须发生的拷贝操作。

如果在数据拷贝时,你不能限制数据类型让它成为blittable 类型,你可以使用InAttribute 和OutAttribute 来进行控制。也COM类似,这些特性控制数据拷贝的方法。In/Out 参数双向拷贝,In参数以及Out参数是一次拷贝。确保你应用严格限制的In/Out组合,来避免更多不必须拷贝。

最后,你可以通过申明如何集群数据来提高性能。对于字符串来说这是最常见的。集群字符串默认是使用BSTRs。这是一个安全的策略,但这也是最低效的。你可以通过修改默认的集群格式减少额外的拷贝操作,可以使用MarshalAs 特性来修改集群方式。下面申明了字符串的集群使用LPWStr或者wchar*:

public void SetMsg(
 [ MarshalAs( UnmanagedType.LPWStr ) ] string msg );

这有一个关于处理托管和非托管层上数据的轶事:数据被拷贝然后在托管和非托管类型之间进行传输。你有三个方法业最小化拷贝操作。首先就是通过限制参数和返回值,让它们是blittable类型。这应该是首选的。当你不能这样做时,应用In和Out特性来最小化必须完成的拷贝和传输操作。最后一个优化就是,很多类型可以不只一种集群方式,你应该选择最优化的一种。

上一页  1 2 3 4 5 6  下一页

Tags:Effecitve 原则 最小化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接