C 和C 的速度大比拼

2021-07-14 22:21:18 字數 3796 閱讀 9002

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.cpp

#include int main(int argc, char *argv)

;

hello world程式的c#**如下:

**二:helloworld2.cs

using system;

namespace helloworld

}}

從這個測試的結果中,我們可以看到程式在相應環境中的載入時間。對於乙個只完成簡單任務的程式來說,無疑我們需要它能快速載入和退出。perl指令碼是個有 代表性的例子,執行這種需要大量的載入時間,從而導致其不能滿足基於cgi且面向效能的web站點的需要。這時,人們常常選擇c++程式替perl指令碼。 但對於需要長時間處於啟用狀態的程式,其載入時間相對執行時效能來說就顯得並不是那麼很重要了。下表是十次測試的結果:

表一: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

#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;

}

下面是埃拉託色尼過濾演算法的c#**:

**四:

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);

}}}

測試的結果並不足以說明那一種環境更快。在這兩個語言的測試中,我旨在說明哪一種語言的構造對測試的結果影響最大。當你基於效能的考慮來選擇某種語言時, 應該直接考慮心需要哪種型別的效能。在這裡,埃拉託色尼過濾演算法測試的是迴圈構造以及比較邏輯和整數基本型別的處理。下面是十次測試,每次進行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 效率比 低一點比 好不少。詳情如下 有一哥們出了個題目,本來不想看的,太簡單,不過看看別人的演算法也是不錯的。...