C#和C++的速度大比拼(二) (轉)

amyz發表於2007-10-17
C#和C++的速度大比拼(二) (轉)[@more@]存取測試

在這一部分,我們將用C++和程式碼來測試兩者對資料庫的存取和處理。方法是對同一個資料庫表進行操作。表結構如下:

CREATE TABLE testtable ( col1 INTEGER, col2 VARCHAR(50), PRIMARY KEY (col1) )


測試將分三個部分,第一部分和第三部分集中對資料處理,第二部分集中對資料存取。資料處理和資料存取的測試結果是分開呈現的。 下面是資料存取和處理的C++程式碼:

程式碼五:.cpp #import "msado15.dll" no_namespace rename("EOF", "EndOfFile") #include #include #include int main(int argc, char* argv[]) { if (argc != 2) { std::cerr << "Usage:tdb [rows]n"; return 1; }; ::CoInitialize(NULL); int NUM = atoi(argv[1]); D dw = ::GetTickCount(); _ConnectionPtr conptr(__uuidof(Connection)); conptr->Open(L"Provr=.Jet.OLEDB.4.0;" "Data =c:db.mdb;", L"", L"", adOpenUnspecified); for (int i=0;isql="ss.str().c_str();" conptr->Execute(sql, &RecordsEffected, adCmdText); }; DWORD dw2 = ::GetTickCount(); std::cout << "Milliseconds = " << dw2-dw << std::endl; dw = ::GetTickCount(); for (int j=0;j<100;j++) { _RecordsetPtr rsptr(__uuidof(Recordset)); rsptr->Open(L" col1, col2 FROM testtable", conptr.GetInterfacePtr(), adOpenForwardOnly, adLockOptimistic, adCmdText); while (rsptr->EndOfFile) { _variant_t v1 = rsptr->GetCollect("col1"); _variant_t v2 = rsptr->GetCollect("col2"); rsptr->MoveNext(); }; rsptr->Close(); }; dw2 = ::GetTickCount(); std::cout << "Milliseconds = " << dw2-dw << std::endl; dw = ::GetTickCount(); for (int i=0;iDB2 [rows]?); return; NUM="int.Parse(args[0]);" OleDbConnection connection; connection="new" OleDbConnection( ?Provider='Microsoft.Jet.OLEDB.4.0;"' ?Data Source='c:db.mdb;");' connection.Open(); ss.Append(?INSERT col2)? VALUES (?); ss.Append(?, ?????); ss.Append(i+1); ss.Append(?????)?); ss.ToString(), command.ExecuteNonQuery(); long j="0;j<100;j++)" DataSet dataset="new" DataSet(); OleDbCommand command="new" OleDbCommand( ?SELECT col1, col2 testtable?, connection); OleDbDataReader reader="command.ExecuteReader();" while (reader.Read()="=" true) int v1="reader.GetInt32(0);" string v2="reader.GetString(1);" reader.Close(); }; dt2="DateTime.Now.Ticks;" System.Console.WriteLine(?Milliseconds='{0}",' dt="DateTime.Now.Ticks;" for (int i="0;i 下面是資料存取和處理的C#程式碼:

程式碼六:db2.cs using System; using System.Data; using System.Data.OleDb; using System.Text; namespace Db { class Class1 { static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine(" col1=" Execute(sql, &RecordsEffected, adCmdText); }; conptr->Close(); dw2 = ::GetTickCount(); std::cout 下表為執行十次,每次100行記錄的結果 表三:資料庫測試結果


序號


C++(~毫秒)


C#(~毫秒)

1 1612/441/450 4086/630/560 2 391/410/441 490/630/520 3 370/421/440 480/510/440 4 371/420/451 470/510/450 5 370/421/461 460/500/450 6 371/420/461 470/500/460 7 370/411/471 470/500/460 8 381/410/451 460/510/470 9 370/421/450 470/510/470 10 391/410/461 460/510/470 平均值 499/419/454 832/531/475
這個結果讓人十分驚訝。在這裡的表現是令人滿意的。一般來說下降百分之二十五的是可以忍受的。這說明.NET在這裡是贏家。

效能測試
XML是資料處理領域的最新技術。許多人對用C#程式碼和Visaul C++程式碼處理或解析XML的效能很感興趣。
下面是一段存取和處理XML的C++程式碼:

程式碼七:xml.cpp #import named_guids #include int main(int argc, char* argv[]) { if (argc != 2) { std::cerr << "Usage:txml [filename]n"; return 1; }; ::CoInitialize(NULL); DWORD dw = ::GetTickCount(); for (int i=0;i<100;i++) { MSXML2::IXMLDocumentPtr DomDocument( MSXML2::CLSID_DOMDocument) ; _bstr_t filename = argv[1]; DomDocument->async = false; DomDocument->load(filename); } DWORD dw2 = ::GetTickCount(); std::cout << "Milliseconds = " << dw2-dw << std::endl; ::CoUninitialize(); return 0; }

下面是一段存取和處理XML的C#程式碼:

程式碼七:xml.cs using System; using System.Xml; namespace xml2 { class Class1 { static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Usage:txml [filename]"); return; } long dt = DateTime.Now.Ticks; for (int i=0;i<100;i++) { XmlDocument doc = new XmlDocument(); doc.Load(args[0]); } long dt2 = DateTime.Now.Ticks; System.Console.WriteLine("Milliseconds = {0}", (dt2-dt)/10000); } } }

執行十次的結果如下:
表四:XML 測試結果
序號 C++(~毫秒) C#(~毫秒) 1 241 1111 2 170 841 3 161 841 4 170 861 5 160 861 6 171 851 7 170 841 8 160 831 9 160 841 10 170 851 平均值 203 873
這個結果又讓人驚訝一次。很難相信.NET XML類的執行比同等的類要慢四至五倍。為什麼會發生這種情況呢?也許只有的兄弟才知道。也許微軟想要把.NET類設計成在某一方面與眾不同。如果不是這樣,那麼微軟的那幫傢伙應該好好一下他們的.NET XML類。
如果你是一個 服務和應用的開發人員,當把.NET用於需要很高效能的應用時,尤其是XML服務時,應三思而行。

總結
需要強調的一點是.NET框架還是一種新的技術。因此,在這個框架中需要做的事情還有很多,它還需要不斷最佳化。另外,這裡對.NET的效能測試也很膚淺,以.NET所擁有的豐富內涵來說,用以上四個方面的測試以及簡陋的文章來說明它的快或者慢是遠遠不夠的。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-977190/,如需轉載,請註明出處,否則將追究法律責任。

相關文章