【asp源码栏目提醒】:网学会员在asp源码频道为大家收集整理了“四探C#类与结构体究竟谁快——跨程序集(assembly)调用-asp net学习网 - 讲义教程“提供大家参考,希望对大家有所帮助!
c.net编程学习网 四探C类与结构体究竟谁快——跨程序集assembly调用 四探C类与结构体究竟谁快——跨程序集assembly调用 内容 四探C类与结构体究竟谁快——跨程序集assembly调用 前面的三次测试都是在同一个项目内的既处于同一个程序集。
那么跨程序集调用会怎么样呢 因为为了保证可维护性我们会把一些常用操作封装到类库中去。
然后实际项目开发时引用该类库使得解决方案中存在多个项目。
编译完成后将会是一个主要的exe和若干个dll文件主exe程序集中的代码会调用dll程序集既形成了跨程序集调用。
分析跨程序集调用的性能有助优化类库架构的设计。
一、测试办法 其实步骤很简单—— 1.重新打开VS2005。
或关闭解决方案。
2.新建一个“Windows应用程序”项目。
如“TryPointerCallns2005”。
3.添加项目选择上次的“TryPointerCall2005”。
现在解决方案中就有两个项目了。
4.选择第2步时新建的项目TryPointerCallns2005添加引用将“TryPointerCall2005”加上去。
5.调整项目属性允许不安全的代码。
6.新建一个类TestCall将测试代码全部Copy过来注意只复制测试代码不复制IPointerCall、PointerCall等实现。
7.修改窗口界面调用TestCall的测试代码。
二、测试环境 编译器—— VS2005Visual Studio 2005 SP1。
采用上述编译器编译为Release版程序最大速度优化。
机器—— HP CQ42-153TX 处理器Intel Core i5-430M2.26GHz Turbo 2.53GHz 3MB L3 内存容量2GB DDR3-1066 三、测试结果 测试结果如下—— PointerCallTool.TryIt 硬编码.栈变量: 162 硬编码.栈分配: 168 硬编码.静态: 164 静态调用: 160 64硬编码.栈变量: 161 64硬编码.栈分配: 160 64硬编码.静态: 160 64静态调用: 162 调用派生类: 1118 调用密封类: 1049 调用结构体: 1069 调用基类: 1128 调用派生类的接口: 1132 调用密封类的接口: 1135 调用结构体的接口: 1453 基类泛型调用派生类: 1769 基类泛型调用基类: 1774 接口泛型调用派生类: 2230 接口泛型调用密封类: 2240 接口泛型调用结构体: 1215 接口泛型调用结构体引用: 1127 接口泛型调用基类: 2241 接口泛型调用派生类的接口: 2230 接口泛型调用密封类的接口: 2244 接口泛型调用结构体的接口: 2302 可见在跨程序集调用时调用密封类、调用结构体不会被即时编译器JIT做内联优化而被当做普通的虚方法调用。
所以对于那些要求性能的代码应尽量保证在同一程序集内避免将其放在类库工程这样能尽可能地利用即时编译器JIT内联优化的机会。
完 源代码下载—— http://files.cnblogs.com/zyl910/TryPointerCall_4.rar 目录—— C类与结构体究竟谁快——各种函数调用模式速度评测http://www.cnblogs.com/zyl910/archive/2011/09/19/2186623.html 再探C类与结构体究竟谁快——考虑栈变量、栈分配、64位整数、密封类http://www.cnblogs.com/zyl910/archive/2011/09/20/2186622.html 三探C类与结构体究竟谁快——MSIL微软中间语言解读http://www.cnblogs.com/zyl910/archive/2011/09/24/2189403.html 四探C类与结构体究竟谁快——跨程序集assembly调用http://www.cnblogs.com/zyl910/archive/2011/10/01/2197844.html 作者zyl910 出处http://www.cnblogs.com/zyl910/ 本文版权归作者和博客园共有欢迎转载但未经作者同意必须保留此段声明且在文章页面明显位置给出原文连接否则保留追究法律责任的权利. ?? 2011 c.net编程学习网 xml地图