之前我發(fā)表了如何用C++開發(fā)ASP.NET,很多人懷疑用C++開發(fā)ASP.NET有什么好處?執(zhí)行速度上有任何優(yōu)勢嗎?第一個問題將在本篇隨筆解答,至于執(zhí)行速度,我認為既然都是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快。
/**/
/*
??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é)果
std::vector?:?
5.618
?sec2
.NET?ArrayList?:?
4.336
?sec3
請按任意鍵繼續(xù)?.?.?.
執(zhí)行結(jié)果令我訝異,我原本預期unmanaged的std::vector應該會比較快,但結(jié)果卻是managed的ArrayList較快,我覺得可能的原因是,managed的數(shù)據(jù)放在CLR內(nèi),而unmanaged數(shù)據(jù)放在不同的地方,當unmanaged的std::vector要在managed的執(zhí)行環(huán)境中顯示時,還要經(jīng)過marshaling的動作,所以浪費了一些時間,類似在.NET中使用COM的dll時,也必須經(jīng)過marshaling,所以速度較慢。
回到我第一個問題,用C++開發(fā)ASP.NET有什么好處?在這個簡單的程序里可以發(fā)現(xiàn),C++/CLI的最大特色,讓你可以將managed和unmanaged程序?qū)懺谝黄穑瑫r使用.NET Framework和傳統(tǒng)C++的library,如STL、boost,這是C#所做不到的,假如你的工程領域已經(jīng)有很多l(xiāng)ibrary,是用C/C++寫的,可能是10幾年前的東西,目前根本沒有C#版本的library,而你又急需這些library的function開發(fā).NET程序,C++/CLI就很方便了,讓你同時擁抱C/C++ library和.NET Framework,這也是Microsoft開發(fā)C++/CLI的原因。
結(jié)論
在C++/CLI開發(fā)managed code,執(zhí)行速度不會比C#、VB快,雖然C++/CLI可以開發(fā)unmanaged code,但若.NET Framework有相對應的支持時,應先考慮.NET Framework,然后再考慮其它C++自己的library,當然C++/CLI不見的適合所有開發(fā)人員,但對于一些開發(fā)人員是很方便的。


博主對STL的實現(xiàn)不了解~
對于哪些開發(fā)人員是方便的?LZ詳細的說明一下。。。BTW,文章不錯,頂先。。。
第一次運行:
std::vector 2.906
ArrayList 4.516
第二次:
std::vector 2.921
ArrayList 3.016
在往下std::vector 變化不大,ArrayList 最快達2.235
加入 ivec.reserve(10000000) 后std::vector 稍快一點,但還是不如ArrayList;
Release 時 std::vector 0.235,加ivec.reserve(10000000) 后0.109
std::vector : 3.328 sec
.NET ArrayList : 20.609 sec
還是STD快 a
Debug Mode:
std::vector : 5.484 sec
.NET ArrayList : 2.344 sec
Release Mode:
std::vector : 1.765 sec
.NET ArrayList : 2.235 sec
seems just the compile configuration issue?