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

原创 2002年12月09日 09:29:00
数据库存取测试

在这一部分,我们将用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;iExecute(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

下表为运行十次,每次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在这里的表现是令人满意的。一般来说下降百分之二十五的性能是可以忍受的。这说明.NET在这里是赢家。

XML性能测试
XML是数据处理领域的最新技术。许多人对用C#代码和Visaul C++代码处理或解析XML文件的性能很感兴趣。
下面是一段存取和处理XML的C++代码:
代码七:xml.cpp
#import <msxml3.dll> named_guids
#include <iostream>
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::IXMLDOMDocumentPtr 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类的运行效率比同等的ActiveX类要慢四至五倍。为什么会发生这种情况呢?也许只有微软的兄弟才知道。也许微软想要把.NET类设计成在某一方面与众不同。如果不是这样,那么微软的那帮家伙应该好好优化一下他们的.NET XML类。
如果你是一个Web 服务和服务器应用的开发人员,当把.NET框架用于需要很高性能的应用时,尤其是XML服务时,应三思而行。

总结
需要强调的一点是.NET框架还是一种新的技术。因此,在这个框架中需要做的事情还有很多,它还需要不断优化。另外,这里对.NET的性能测试也很肤浅,以.NET所拥有的丰富内涵来说,用以上四个方面的测试以及简陋的文章来说明它的快或者慢是远远不够的。

C#和C++的速度大比拼

C#目前是微软.NET平台首推的应用程序开发语言。C#编写的应用程序必须运行在一个特殊的环境中,即受控环境(managed)。与以往非受控(unmanaged)的C++相比,C#应用程序的性能到底如何...
  • lhfslhfs
  • lhfslhfs
  • 2013年03月04日 16:00
  • 3552

C#和C++的速度大比拼

C#目前是微软.NET平台首推 的应用程序开发语言。C#编写的应用程序必须运行在一个特殊的环境中,即受控环境(managed)。与以往非受控(unmanaged)的C++相比, C#应用程序的性能到底...
  • my98800
  • my98800
  • 2016年07月14日 13:32
  • 124

java与C#执行速度的比较

有的朋友纠结于选择哪种语言来编程,这里给出个参考。想要开发方便还是执行快速?...
  • sqds
  • sqds
  • 2015年06月03日 17:26
  • 1560

C#调用C++的dll及MATLAB的dll的方法(二)

在上一篇博客中我们介绍了一下如何利用C#调用C++封装的托管代码,这一篇我们介绍一下如何用C#调用MATLAB封装的代码。 MATLAB的程序完成的功能主要是人脸对齐和图像的crop操作,以便后面送给...
  • fantasia_fang
  • fantasia_fang
  • 2016年04月01日 17:56
  • 788

C++、C#、Java、JavaScript之间的性能比较

标题:C++、C#、Java、JavaScript之间的性能比较 Author:kagula Date 2015-10-25 测试目的     想知道C++语言同其它常用语言在不针对硬件手动优化之...
  • lee353086
  • lee353086
  • 2015年10月25日 11:11
  • 2412

Python到底有多慢? -- 比JAVA慢超10倍,比VC慢30倍!(附C#, C++, Delphi, Lazarus的效率对比)

谁都知道Python最大的缺点就是性能差,到底多差网上没有具体数据,今天自己做了一个测试 。      首先要声明一下, 这个简单测试只是通过对阵列的建立、统计的耗时比较, 本以为阵列操作是pytho...
  • rocklee
  • rocklee
  • 2015年12月17日 14:35
  • 4451

灰度图像二值化-----c++实现

前天闲着没事干,就写了写BMP图像处理,感觉大家还比较感兴趣。。所以现在没事,继续更新。。这次简单的写了灰度图像二值化。。这是什么概念呢? 图像的二值化的基本原理    图像的二值化处理就是将图像上的...
  • keep_moving_cqu
  • keep_moving_cqu
  • 2013年08月13日 16:47
  • 5996

比比Java和C#语言运行的快慢

前言:闲来无事,在图书馆随便看看书,发现不论是在论坛还是写书的作者都喜欢将Java和C#拿来比较一番。谈论语言的是非。所以我决定,从语言的运行快慢来比较一下究竟哪种语言快些。...
  • z702143700
  • z702143700
  • 2016年01月03日 00:17
  • 3047

c#-Winform实时显示上传下载速率

c#-Winform实时显示上传下载速率
  • yangyisen0713
  • yangyisen0713
  • 2014年10月15日 10:24
  • 2304

【福利】华山论剑之项目大比拼

素材未到。暂时不更。
  • mengdonghui123456
  • mengdonghui123456
  • 2016年04月03日 20:38
  • 682
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#和C++的速度大比拼(二)
举报原因:
原因补充:

(最多只允许输入30个字)