之前我發(fā)表了如何用C++開(kāi)發(fā)ASP.NET,很多人懷疑用C++開(kāi)發(fā)ASP.NET有什么好處?執(zhí)行速度上有任何優(yōu)勢(shì)嗎?第一個(gè)問(wèn)題將在本篇隨筆解答,至于執(zhí)行速度,我認(rèn)為既然都是managed code,C++/CLI、C#、VB應(yīng)該都一樣快,但C++/CLI有個(gè)特色,就是能在managed code中寫unmanaged code,類似C#的unsafe code,假如在C++/CLI中使用unmanaged code,是否能在速度上占便宜呢?我寫了以下的程序作測(cè)試。


為了克服array必須事先宣告大小的不便,STL和.NET都有解決的方式,在STL的container當(dāng)中,速度最快的就是std::vector,而.NET當(dāng)中就是ArrayList,所以我想測(cè)試在同樣的程序中,若使用unmanaged 的std::vector是否會(huì)比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 }

執(zhí)行結(jié)果

1 std::vector?:? 5.618 ?sec
2 .NET?ArrayList?:? 4.336 ?sec
3 請(qǐng)按任意鍵繼續(xù)?.?.?.


執(zhí)行結(jié)果令我訝異,我原本預(yù)期unmanaged的std::vector應(yīng)該會(huì)比較快,但結(jié)果卻是managed的ArrayList較快,我覺(jué)得可能的原因是,managed的數(shù)據(jù)放在CLR內(nèi),而unmanaged數(shù)據(jù)放在不同的地方,當(dāng)unmanaged的std::vector要在managed的執(zhí)行環(huán)境中顯示時(shí),還要經(jīng)過(guò)marshaling的動(dòng)作,所以浪費(fèi)了一些時(shí)間,類似在.NET中使用COM的dll時(shí),也必須經(jīng)過(guò)marshaling,所以速度較慢。


回到我第一個(gè)問(wèn)題,用C++開(kāi)發(fā)ASP.NET有什么好處?在這個(gè)簡(jiǎn)單的程序里可以發(fā)現(xiàn),C++/CLI的最大特色,讓你可以將managed和unmanaged程序?qū)懺谝黄穑瑫r(shí)使用.NET Framework和傳統(tǒng)C++的library,如STL、boost,這是C#所做不到的,假如你的工程領(lǐng)域已經(jīng)有很多l(xiāng)ibrary,是用C/C++寫的,可能是10幾年前的東西,目前根本沒(méi)有C#版本的library,而你又急需這些library的function開(kāi)發(fā).NET程序,C++/CLI就很方便了,讓你同時(shí)擁抱C/C++ library和.NET Framework,這也是Microsoft開(kāi)發(fā)C++/CLI的原因。


結(jié)論
在C++/CLI開(kāi)發(fā)managed code,執(zhí)行速度不會(huì)比C#、VB快,雖然C++/CLI可以開(kāi)發(fā)unmanaged code,但若.NET Framework有相對(duì)應(yīng)的支持時(shí),應(yīng)先考慮.NET Framework,然后再考慮其它C++自己的library,當(dāng)然C++/CLI不見(jiàn)的適合所有開(kāi)發(fā)人員,但對(duì)于一些開(kāi)發(fā)人員是很方便的。