之前我发表了如何用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快。

 1 /*  
 2 (C) OOMusou 2006  http://oomusou.cnblogs.com
 3
 4 Filename    : VectorVsArrayList.cpp
 5 Compiler    : Visual C++ 8.0
 6 Description : Demo std::vector and ArrayList in C++/CLI
 7 */

 8 #include  " stdafx.h "
 9 #include  < vector >
10 #include  < ctime >
11 #include  < iostream >
12
13 using   namespace  System;
14 using   namespace  System::Collections;
15
16 int  main()
17 {
18      //  Use STL std::vector
19     clock_t t1  =  clock();
20     
21     std::vector < int >  ivec;
22
23      for ( int  i = 0 ; i  !=   10000000 ++ i)  {
24       ivec.push_back(i);
25     }

26
27     t1  =  clock()  -  t1;
28
29     std::cout  <<   " std::vector :  "   <<  ( double )t1 / CLOCKS_PER_SEC  <<   "  sec "   <<  std::endl;
30
31
32      //  Use .NET ArrayList
33     clock_t t2  =  clock();
34
35     ArrayList ^  al  =  gcnew ArrayList;
36      for ( int  i = 0 ; i  !=   10000000 ++ i)  {
37       al -> Add(i);
38     }

39     t2  =  clock()  -  t2;
40
41     std::cout  <<   " .NET ArrayList :  "   <<  ( double )t2 / CLOCKS_PER_SEC  <<   "  sec "   <<  std::endl;
42
43      return   0 ;
44 }

执行结果

1 std::vector :  5.618  sec
2 .NET ArrayList :  4.336  sec
3 請按任意鍵繼續 . . .


执行结果令我讶异,我原本预期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不见的适合所有开发人员,但对于一些开发人员是很方便的。