上一篇:Visual C++ 2005 中的XML注释 >>
托管C++中函数调用的双重转换
非托管入口点可能是所有调用的默认入口(在 Visual Studio .NET2003 中,编译器总是会选择非托管入口,但是在Visual Studio 2005中,如果参数或者返回值中包含托管类型,那么编译器会选择托管入口),而另外一个只是使用托管C++中的互操作功能对默认入口的调用。在一个托管函数被另一个托管函数调用的时候,这可能会造成不必要的托管/非托管上下文切换和参数/返回值的复制。如果函数不会被非托管代码使用指针调用,那么可以在声明函数时用VC2005新增的__clrcall修饰符阻止编译器生成两个入口。
现在用简单的冒泡排序算法来比较一下使用__clrcall之后的性能改善程度。
| using namespace System; #define ARRAY_SIZE 1000 struct bubbleBase { int value; }; class bubble1:public bubbleBase { public: virtual int getvalue(){return value;} virtual void setvalue(int newvalue){value=newvalue;} }; class bubble2:public bubbleBase { public: virtual int __clrcall getvalue(){return value;} virtual void __clrcall setvalue(int newvalue){value=newvalue;} }; template<class T> void bubbleSort(int length) { TimeSpan ts; T* array1=new T[ARRAY_SIZE]; for (int i=0;i<ARRAY_SIZE ;i++) { array1[i].setvalue(ARRAY_SIZE-i-1); } Int64 ticks=DateTime::Now.Ticks; int i, j,temp, test; for(i = length - 1; i > 0; i--) { test=0; for(j = 0; j < i; j++) { if(array1[j].getvalue() > array1[j+1].getvalue()) { temp = array1[j].getvalue(); array1[j].setvalue(array1[j+1].getvalue()); array1[j+1] .setvalue(temp); test=1; } } if(test==0) break; } ts=TimeSpan::FromTicks(DateTime::Now.Ticks-ticks); Console::WriteLine("BubbleSort {0} Items: {1} Ticks", ARRAY_SIZE, ts.Ticks ); delete array1; } int main(array<System::String ^> ^args) { bubbleSort<bubble1>(ARRAY_SIZE); bubbleSort<bubble2>(ARRAY_SIZE); return 0; } |
运行结果是
BubbleSort 1000 Items: 3281250 Ticks
BubbleSort 1000 Items: 312500 Ticks
可以看到,__clrcall会大大加快在托管代码中调用托管函数的速度。
顺便说一下,在随VC8.0发布的STL中增加了很多安全特性,但是这也会造成程序的运行速度减慢。如果你确认程序不会有缓冲区溢出或者内存越界访问的问题,那么可以把_SECURE_SCL定义成0来关掉这个特性。
|
编辑推荐:Visual C++.NET编程基础讲座 |
下一篇:托管C++中GDI+和GDI混合编程技术 >>
相关文章:
- · 在VS2005中打造自己的Starter Kits
- · Visual Basic.NET实现主/从数据表视图
- · C#中ref和out的使用小结
- · Visual C#命名空间详解
- · C#中加强ListView控件的功能
- · 用托管C++编写自定义Web组合控件
- · 叩开C#之门系列之C#与面向对象编程语言
- · C# 2.0 套接字编程实例初探
- · 叩开C#之门系列之几个重要名词
- · 炮打“华军司令部”,“迅雷”的一张大字报
- · C#+低级Windows API钩子拦截键盘输入
- · 在C#中动态调用native dll的导出函数
- · C#3.0新特性之隐式类型局部变量的使用
- · 试用报告:笔记本中体验win vista的魅力
- · 用C#实现HTTP协议下的多线程文件传输
- · windows vista 5466细节全览(多图)
- · 性能更佳 微软发布vista最新测试版5466
- · 如何在C#中播放AVI短片并使背景透明
- · 主流测试:vista你为游戏准备好了吗?
- · windows xp和vista双系统安装不完全攻略
- · 用C#开发Windows服务监控系统使用
- · C#中父窗口和子窗口之间实现控件互操作
- · Visual C# 2.0泛型编程基础
- · Visual C#泛型学习之泛型介绍
- · 为非主流主机优化 打造最强vista 5456
- · C#与松下FP∑可编程控制器的通信
- · 谈谈购买win vista的十大理由及放弃原因
- · Visual C#使用DirectX实现视频播放
- · Visual C#程序员面试基础问题和答案
- · 用户需注意!选购“vista笔记本”要谨慎
- · intel透露最新windows vista认证要求
- · 比xp做得更好:寻找windows vista漏洞
- · 通过包技术扩展Visual Studio 2005
- · 手动快速卸载windows vista系统的方法
- · .Net Framework3.0 实践纪实之布局
- · 观点:.NET发展中的几个失误
- · sata串口硬盘windows vista驱动安装实录
- · 基于AJAX.NET技术的DataGrid控件开发
