c#目前是微軟.net平台首推 的應用程式開發語言。c#編寫的應用程式必須執行在乙個特殊的環境中,即受控環境(managed)。與以往非受控(unmanaged)的c++相比, c#應用程式的效能到底如何呢?經過幾個方面的效能測試,我們發現c#應用程式的執行速度遠遠不如非受控c++應用程式。在這場速度的大比拼中,非受控c ++具有明顯的優勢。它將一如既往地成為大多數程式設計師的最愛。
本文擬通過一些正統的和非正統的效能測試方法,對c#和c++程式進行測試。在這些測試的統計資料中。讀者會發現c#程式的效能到底如何。做為程式設計師,我 對c++情有獨鍾。在我的職業生涯中,一直都在使用visual c++。希望本文能給程式設計師們一點提示,以便在編寫不同的應用時選擇適合的程式語言。
visual c++是win32平台上效能最好的編譯器之一,我想這已經成為一種共識。.net是微軟提供的一種新的應用平台。
首先我說明一下自己機器的軟硬體環境:
硬體環境:dell inspiron 3800 g700gt 膝上型電腦 cpu/piii/700,rom/128mb,hd/12gb。
軟體環境:windows 2000 + sp2,.net平台 + visual studio.net,office xp。
所有的測試均是在命令列狀態下以release模式編譯程式,而非visual studio ide整合開發環境,並在命令列狀態下執行程式。沒有對編譯過程進行任何優化。
本文的測試由四個部分組成。其中包括用著名的埃拉託色尼過濾演算法(sieves of eratosthenes)進行的測試及其它的單項測試,單項測試主要的考察.net框架中特定專案的效能:
本文不打算對測試結果進行詳細解釋。在每一項測試中,我首先將用於測試的演算法和**列出來。然後再列出測試結果資料。最後,針對這些資料勾勒出簡要的結論。
有一點在測試過程中相當重要,那就是我試圖使兩個環境的測試**盡可能相同。這樣可以使得測試結果更有說服力。
hello world
hello world測試程式主要是評測載入乙個程式及其執行時環境所用的時間。c++的程式執行需要c執行庫,從所周知,這個庫是相當輕量級的。而c#程式的執行必須要載入.net框架,從目前的情況看,這個框架無庸置疑不是乙個輕量級的。
hello world程式的c++**如下:
**一:helloworld.cpphello world程式的c#**如下:#include int main(int argc, char *argv)
;
**二:helloworld2.cs從這個測試的結果中,我們可以看到程式在相應環境中的載入時間。對於乙個只完成簡單任務的程式來說,無疑我們需要它能快速載入和退出。perl指令碼是個有 代表性的例子,執行這種需要大量的載入時間,從而導致其不能滿足基於cgi且面向效能的web站點的需要。這時,人們常常選擇c++程式替perl指令碼。 但對於需要長時間處於啟用狀態的程式,其載入時間相對執行時效能來說就顯得並不是那麼很重要了。下表是十次測試的結果:using system;
namespace helloworld
}}
表一:hello world 測試結果
序號c++(~毫秒)
c#(~毫秒)140
1221220
1213
10 130
410
1005
10 110
610
1307
10 120
810
1409
10 150
1020
140平均值
15 235
測試結果的精確程度由gettickcount函式的精度決定。其精度大概在百分之一秒。從結果我們可以得出這樣的結論。第一,冷啟動.net應用過程所 花費的時間比執行相同的應用多出一秒的時間。第二,啟動後的程式再執行時,在c++**大約是c#**執行時間開銷的十分之一。一般這種差別可以忽略不 計。
埃拉託色尼過濾演算法測試
埃拉託色尼過濾演算法測試程式評估基本的整型演算法和比較邏輯。這個演算法歷史悠久,它早在計算機出現之前就已經存在。因此用它來評估人們在各種環境中建立的演算法效能具有一定的典型性或代表性。
埃拉託色尼過濾演算法的c++**如下:
**三:sieve.cpp下面是埃拉託色尼過濾演算法的c#**:#include #include #include #include #include using namespace std;
int main(int argc, char *argv)
; size_t num = atoi(argv[1]);
dword dw = ::gettickcount();
vector primes(8192 + 1);
vector::iterator pbegin = primes.begin();
vector::iterator begin = pbegin + 2;
vector::iterator end = primes.end();
while (num--) }}
} dword dw2 = ::gettickcount();
std::cout << "milliseconds = " << dw2-dw
<< std::endl;
return 0;
}
**四:測試的結果並不足以說明那一種環境更快。在這兩個語言的測試中,我旨在說明哪一種語言的構造對測試的結果影響最大。當你基於效能的考慮來選擇某種語言時, 應該直接考慮心需要哪種型別的效能。在這裡,埃拉託色尼過濾演算法測試的是迴圈構造以及比較邏輯和整數基本型別的處理。下面是十次測試,每次進行10000 次重複的測試結果:using system;
namespace sieve
int num = int.parse(args[0]);
long dt = datetime.now.ticks;
int primes = new int[8192+1];
int pbegin = 0;
int begin = 2;
int end = 8193;
while (num-- != 0)
for (int i = begin; i < end; ++i);}
};};
long dt2 = datetime.now.ticks;
system.console.writeline("milliseconds = ",
(dt2-dt)/10000);
}}}
表二:過濾演算法測試結果
序號c++(~毫秒)
c#(~毫秒)
11342
2724
21342
2714
31342
2724
41342
2724
51342
2734
61342
2724
71362
2734
81352
2734
91362
2724
101352
2724
平均值1348
2726
這個結果很能說明問題。整數計算c#所花的時間是c++的兩倍。所以對於乙個邏輯複雜的伺服器來說,使用非受管c++**比c#**更適合。
上面的c++**和c#**之間有乙個差別,即c#使用的是本機陣列,而c++**用的是向量模板類,我用本機陣列重寫了c++**,按說應該更快。是結果不是這樣,本機c++陣列執行用時是1900毫秒。
C 的6種常用集合類大比拼
一.先來說說陣列的不足 也可以說集合與陣列的區別 1.陣列是固定大小的,不能伸縮。雖然system.array.resize這個泛型方法可以重置陣列大小,但是該方法是重新建立新設定大小的陣列,用的是舊陣列的元素初始化。隨後以前的陣列就廢棄!而集合卻是可變長的 2.陣列要宣告元素的型別,集合類的元素型...
虛擬桌面實施和維護大比拼
2011年度的tolly測試報告新鮮出爐了。在本期測試中,tolly對 vmware view 4.6和citrix xendesktop 5 兩款產品的安裝 公升級流程進行了評估,並對在具有代表性的 lan 中管理虛擬桌面環境的日常工作進行了比較。此外,測試還重點針對使用瘦客戶端的環境中執行多 效...
int 轉 String 的效率大比拼
先說一下我自己的實驗結論吧,int 轉 string 的三個方法 假設 x 是int 型變數 x,效率最低 integer.tostring x 效率最高 string.valueof x 效率比 低一點比 好不少。詳情如下 有一哥們出了個題目,本來不想看的,太簡單,不過看看別人的演算法也是不錯的。...