日期:2009-06-19  浏览次数:20448 次

转者注:

C#数据库速度较快不能说明C#本身性能好,因为他们通过外部调用实现,时间集中在外部调用上,就如同
for(int i=0;i<100;i++)

{
//外部调用1秒钟
}
C#用125秒,C++用100秒,怎么能用慢了25%来衡量?C#速度的测试结果和Java相当,实际上Java和C#都比C++慢了5~20倍(要考虑处理不同的数据性能不同,比如整型、浮点型、字符串,要考虑在堆中分配内存造成的速度降低,要考虑后台释放内存的开销,还要考虑其他因素,比如Java/C#中字符串相加和C++中strcpy的巨大效率差异)。

另外,开发效率也是首先需要考虑的,这方面,我认为c#比c++好。
至于,你选择哪种开发工具并不是本文要讨论的,具体应用不同,平台不同,开发工具自然不同。




数据库存取测试

在这一部分,我们将用C++和C#代码来测试两者对数据库的存取和处理。方法是对同一个数据库表进行操作。表结构如下: CREATE TABLE testtable
(
  col1 INTEGER,
  col2 VARCHAR(50),

  PRIMARY KEY (col1)
)      

测试将分三个部分,第一部分和第三部分集中对数据处理,第二部分集中对数据存取。数据处理和数据存取的测试结果是分开呈现的。 下面是数据存取和处理的C++代码: 代码五:db.cpp
#import "msado15.dll" no_namespace rename("EOF", "EndOfFile")
#include <iostream>
#include <string>
#include <sstream>

int main(int argc, char* argv[])
{
  if (argc != 2)
  {
    std::cerr << "Usage:\tdb [rows]\n";
    return 1;
  };

  ::CoInitialize(NULL);
  int NUM = atoi(argv[1]);
  Dword dw = ::GetTickCount();
  _ConnectionPtr conptr(__uuidof(Connection));
  conptr->Open(L"Provider=Microsoft.Jet.OLEDB.4.0;"
    "Data Source=c:\\db.mdb;",
    L"",
    L"",
    adOpenUnspecified);
  for (int i=0;i<NUM;i++)
  {
    VARIANT RecordsEffected;
    RecordsEffected.vt = VT_INT;
    std::wstringstream ss;
    ss << L"INSERT INTO testtable (col1, col2) "
      << "VALUES ("
      << i+1 << L", ''" << i+1 << L"'')";
    _bstr_t sql = 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"SELECT 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;i<NUM;i++)
  {
    std::wstringstream ss;
    VARIANT RecordsEffected;
    RecordsEffected.