Effecitve C# 原则46:最小化与其它非托管代码的交互
2009-02-19 08:17:24 来源:WEB开发网接下来,让我们假设你已经决定重写全部代码并不实际。一些不同的策略要求你从.Net中访问本地代码。你须要明白在本地代码和托管代码的边界上传递数据时的开销的低效。在使用交互时有三个开销。首先就是数据集群处理,这在托管堆和本地代码堆之间进行数据传递时发生。其次就是在托管代码和非托管代码进行交互时的大量数据吞吐时的开销。你以及你的用户要承担这些开销。第三个开销就只是你自己的了:你要在这个混合的开发环境中添加很多工作来实现交互。这也是最糟糕的一个,所以你的设计应该决定最小化这样的开销。
让我们开始讨论交互时在性能上的开销,以及如何最小化这些开销。数据集群是最大的一个因数,就像是网络服务或者远程操作一样,你须要尽可能使用笨重的(chunky)API而不是小巧的(chatty )API(译注:数据集群是指你没有办法即时的与本地代码进行交互,而有一个延时,这个延时就使用数据堆集起来一起处理,这样就使得你应该尽可能少的与本地代码进行交互,而要选择一些一次可以处理较多数据的API)。你可以用不同的方法来完成与非托管代码的交互。你可以重新修改已经存在的非托管代码来创建一个笨重的API,更适合交互的API。常规的COM应用中是申明很多属性,这样客户可以设置并修改COM对象内部的状态或者行为。每次的设置属性都会集群数据,而且不得不穿越边界。(而且每在穿越交互边界时也会有thunks。)这非常的低效,不幸的是,COM对象或者非托管库可能不受你控制。当这种情况发生时,你须要完成更麻烦的工作。这时,你可以创建一个轻量级的C++库,通过使用你所须要的chunkier API来暴露类型的功能。这就要增加你的开发时间了(也就是第三个开销)。
当你封装一个COM对象时,确保你修改的数据类型已经在本地代码一托管代码之间提供了最好的数据集群策略。有些类型可以很好的比其它类型进行集群,试着限制用于在本地代码和托管代码之间进行传递的数据类型,尽量使用blittable数据。blittable是指托管代码和本地代码都一样使用的类型。数据内容可以直接拷贝而不用管对象的内部的结构。某些情况下,非托管代码可能使用托管代码的代码。下面列出了blittable 类型:
更多精彩
赞助商链接