之前我发表了如何用C++开发ASP.NET,很多人怀疑用C++开发ASP.NET有什么好处?执行速度上有任何优势吗?第一个问题将在本篇随笔解答,至于执行速度,我认为既然都是managed code,C++/CLI、C#、VB应该都一样快,但C++/CLI有个特色,就是能在managed code中写unmanaged code,类似C#的unsafe code,假如在C++/CLI中使用unmanaged code,是否能在速度上占便宜呢?我写了以下的程序作测试。为了克服array必须事先宣告大小的不便,STL和.NET都有解决的方式,在STL的container当中,速度最快的就是std::vector,而.NET当中就是ArrayList,所以我想测试在同样的程序中,若使用unmanaged 的std::vector是否会比managed ArrayList快。
执行结果
执行结果令我讶异,我原本预期unmanaged的std::vector应该会比较快,但结果却是managed的ArrayList较快,我觉得可能的原因是,managed的数据放在CLR内,而unmanaged数据放在不同的地方,当unmanaged的std::vector要在managed的执行环境中显示时,还要经过marshaling的动作,所以浪费了一些时间,类似在.NET中使用COM的dll时,也必须经过marshaling,所以速度较慢。回到我第一个问题,用C++开发ASP.NET有什么好处?在这个简单的程序里可以发现,C++/CLI的最大特色,让你可以将managed和unmanaged程序写在一起,同时使用.NET Framework和传统C++的library,如STL、boost,这是C#所做不到的,假如你的工程领域已经有很多library,是用C/C++写的,可能是10几年前的东西,目前根本没有C#版本的library,而你又急需这些library的function开发.NET程序,C++/CLI就很方便了,让你同时拥抱C/C++ library和.NET Framework,这也是Microsoft开发C++/CLI的原因。结论在C++/CLI开发managed code,执行速度不会比C#、VB快,虽然C++/CLI可以开发unmanaged code,但若.NET Framework有相对应的支持时,应先考虑.NET Framework,然后再考虑其它C++自己的library,当然C++/CLI不见的适合所有开发人员,但对于一些开发人员是很方便的。