首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

WinRT开发语言的效能和效率

2013-02-24 
WinRT开发语言的功能和效率WinRT开发有着多种选择性,就编程语言这一点就表现的很突出;这里就这一点 深入展

WinRT开发语言的功能和效率

WinRT开发有着多种选择性,就编程语言这一点就表现的很突出;这里就这一点 深入展开,探讨在WinRT开发之初如何依据各 个编程语言的特性、功能和效率来对 产品的技术方向做出选择。

这里我选择运行计算复杂度较高的算法作为测试方法,虽然不能代表全部,但 是很大程度上展示大家平时开发过程中所面临的常见场景 和问题。考虑到演示和 理解,就选择了查找100000以内的所有素数的个数的算法作为演示。另外也顺带演 示如何在WinRT下实现多编程语言和技 术之间的协作吧。

关于基本知识和算法吧详细的说明,请自行搜索各大引擎吧(关键 词:prime、素数),这里我就列举在各个语言下我的简单实现吧,其中包括使用 普通算法和并 行计算的两个版本。

 

第一部分,从目前.NET主流来看吧,以C# 为例,普通版本,这个没什么多说的,就是从前往后看某个数是不是素数:

执行次数1(启动)2345普通14.02999.00059.18258.002111.0181并行6.00082.00042.99932.00143.999

第二种场景,将C#算法包装在一个类库里(注意 是CLR类库,只能在C#/VB直接通用),在C# WinRT App工程中调用这个类库,执行 结果如下(单位毫秒):

执行次数1(启动)2345普通12.02999.001910.0039.00149.00017并行6.000823.00032.99971.9995

第三种场景,将C#算法包装到一个Windows Runtime Component(WRC)中,在C# WinRT App工程中调用这个WRC类库,执行结 果如下(单位毫秒):

执行次数 1(启动) 2345 普通 11.9904 9.0032 9 9。00289.00149 并行  6.0008 1.9817 1.9985 1.9993 2

第四种场景,将C#算法包装到一个Windows Runtime Component(WRC)中,在WinJS App工程中调用这个WRC类库,执行结果如 下(单位毫秒):

执行次数 1(启动) 2345 普通 11 9 8 98并行  4 1 1 3 2

小结:以上是从.NET角度来进行的比较,很容易 看出第一次CLR加载在这里性能损耗表现的很明显,完成加载之后性能将稳定在一 定范 围内波动;另外,并行计算在纯算法的应用中有很明显的性能优势。

 

第二部分,接下来我们回归Native环境,这里我 依然使用普通和并行计算两种来尝试,普通的依然没什么可说的(实际上和C#的没 区 别,除了关键字不一样)。

执行次数 1(启动) 2345 普通 8.00197.9991 8.0209 8.9843 8.0181 并行  1.9794 1.998 1.9994 1.984 2.0003

第二种场景,将C++算法包装在DLL中,在C++ WinRT App中使用,执行结果如下(单位毫秒):

执行次数 1(启动) 2345 普通 99 9 8 9 并行  32 3 2 2

第三种场景,将C++算法包装在动态连接库Dll中,在C# WinRT App中通过 PInvoke来调用,执行结果如下(单位毫秒):

执行次数 1(启动) 2345 普通 99 8 9 9 并行  32 3 2 3

第四种场景,将C++算法包装在静态链接库Lib中,在C++ WinRT App中调用,执 行结果如下(单位毫秒):

执行次数 1(启动) 2345 普通 88 8 9 9 并行  23 3 2 3

第五种场景,将C++算法包装在Windows Runtime Component(WRC)中,在C# WinRT App中调用,执行结果如下(单位毫秒):

执行次数 1(启动) 2345 普通 8.00148.0191 8.0293 8.0019 9.0291并行  1.99941.9999 1.998 1.9994 2.99982

第六种场景,将Windows Runtime Component(WRC)中,在WinJS App中调用, 执行结果如下(单位毫秒):

执行次数 1(启动) 2345 普通 98 9 8 8 并行  22 3 2 3

第七种场景是将C++算法包装在Windows Runtime Library(WRL,基于COM的底 层开发)中,然后在任何一种WinRT App中调用,可以预见这是一种很强大的方 式,但同时也是最费解的一种方式,我成功的包装了普通算法的COM版,但是尝试 了很长时间不能成功实现并行运算 的版本,也就放弃在这里展示了,如果你知道 如何在WRL中实现并行计算并返回 IAsyncOperation<T>,请不吝赐教。 

小结:基于C++的实现在适用性、稳定性和执行效率上无可挑剔,如果对于所有 细节(包括第一次启动)的效率考虑,C++是优先 的;如果考虑到C++的复杂度, 如果项目对性能要求可以适当放松但对进度要求很高的时候,选择CLR会比较容易 控制的;如果原来已有的Web项目 向WinRT迁移,那么前段展示则可以考虑使用 WinJS+HTML来实现,后台算法根据需要选择C++或者CLR。

 

第三部分,如果所有的算法全部运行在 JavaScript中,那么其性能如何呢?这里我先买个关子,留待你自己去探究和发 掘。

 

总结,WinRT在编程语言的选择性上有着非常好的 灵活性,在做选择的时候需要充分考虑自己的要求,比如性能、比如工期、比如经 验等 等。对于全新项目,在有经验的情况下,追求极致性能的首先首当其冲是 C++,如果考虑到经验和掌控,可以选择使用C++做底层,选择相对容易上手 的 C#/VB或者HTML+JS做界面的方法;如果项目工期要求很紧,或者从老系统迁移,那 么这时候更多的考虑是使用已有资源,直到性能瓶颈的时 候才采取措 施——以C++重写性能瓶颈来解决,当然,如果没有C++经验,也可以考 虑使用C#/VB来 实现WRC以包装核心逻辑,从而提升运行效率。

 

附以上测试源代码和测试工程,点击这里下载。

热点排行