Chinaunix首页 | 论坛 | 博客
  • 博客访问: 523104
  • 博文数量: 576
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5020
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(576)

文章存档

2011年(1)

2008年(575)

我的朋友

分类:

2008-10-14 14:57:58

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 
#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]);
  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  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::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所拥有的丰富内涵来说,用以上四个方面的测试以及简陋的文章来说明它的快或者慢是远远不够的。(全文完)
--------------------next---------------------

现代的商业理念:顾客就是上帝。
微软VS的顾客是咱程序员, 因此使用C#比用VC的开发速度更快;
程序员的顾客是最终用户, 用户对应用程序的满意程度影响到我们的收入。 ( hsmin 发表于 2003-3-26 14:23:00)
 
建议数据库测试ADO换成OLE/DB试试! ( timdong 发表于 2002-9-29 15:04:00)
 
作者做得不错。这种精神值得我们学习。 ( 冬冬 发表于 2002-9-5 17:53:00)
 
强烈要求java & c# & c++做个测试 ( gost 发表于 2002-8-21 16:17:00)
 
你们说的我一点都不懂呀,你们真傻,为了一种语言的一点点速度,争论不修,不如喝点酒了,我就喝了,但我想学C#在如今硬件的高速度下,什么C呀C#呀,都一样,一般软件是体现不出来的。如果你们想要高速度,不如学汇编了。或机器语言了。要看开发出软件的难易成程。 ( 有一点弱智 发表于 2002-8-17 23:28:00)
 
在XML的读取上,.Net Framework 的XMLReader性能要比XMLDocument好,用XMLDocument比ActiveX慢很多,但用XMLReader就不一定了 ( linzfeng 发表于 2002-6-14 15:11:00)
 
C++与C#作比较?!你为什么不把汇编与VB做比较?!虽然C++与C#都是C字头,其实除了表面上的相同之外,在本质上是完全不同的,就像JAVA用的语法不也与C差不多?!凭什么C#是C,而JAVA就不是?我认为C#与JAVA是一样的,只是借用了C的语法而已,所以无需比较,一看他的实现原理就知道谁快谁慢 ( Violet 发表于 2002-6-6 15:51:00)
 
我个人觉得这个测试的说服力不是很强:
1、作者的第一个测试,是测试在加载速度上
首先,有一点是显而易见的,vc++的加载速度是绝对要比c#快的,如果vc连这点优势都没有,那还要vc干什么。其次,在这个机器的配置上,内存显然少了一些,.net很消耗内存,这点和java是一样的,c#和java都是牺牲速度和占用更多的资源来实现程序开发的有效性,因此从速度上来比较vc和c#本身的出发点就是一个错误。
2、第二个测试,是测试cpu占有率的
其实你不用测试都可以明白,c#必然在指令上有额外的开销,c#必须编译成中间代码,然后中间代码在CLR平台上运行,你要求c#和直接用机器码运行的vc++比,实在是明摆着让飞机和宇宙火箭去比速度,毫无疑问宇宙火箭的速度比飞机快,但是我总不能为了去趟北京发射火箭啊。
3、数据库连接测试
这个测试就有点可笑了,其实和数据库连接的关键瓶颈在网络传输和数据库的响应上,而且单个的连接更是无关痛痒,那个时间差别估计就是c#和vc++的代码运行差别而已,最后那个惊讶实在是好像在看了大街的人群里面看宝马和自行车比赛速度的结果一样可笑,那有什么要惊讶的。
4、最后一个xml解析测试
这个测试其实有些重复,和第二个测试其实一样,c#作为中间代码当然需要付出额外的开销,其次,内存还是大问题,128M下运行c#的程序,跑起来当然没有问题,要跑得舒服,还是少了点。
最后,c#只有在和java上的比试才有意义,如果作者能够把上面的测试用c#和java实现一次,那么得出的数据和结果就比较有意思了。 ( xqssl 发表于 2002-6-1 10:39:00)
 
不能因为硬件的发展而放弃作为程序员的重要责任-即可靠性、速度、代码体积,都必须追求完美的平衡。该牺牲的应该是我们的精力和时间,因此应该选择优雅的语言来完成我们的工作。任何偷懒的借口或行为都是对这个神圣职业的亵渎。

- 写程序理应象诗人作诗那样追求艺术上的完美,而诗歌一样美妙的代码需要灵感,否则只不过是粗制滥造的劣等货色 - ElectricAngel

( 电脑天使 发表于 2002-5-27 2:22:00)
 
I like VC ( invent1 发表于 2002-5-26 22:34:00)
 
.......................................................

--------------------next---------------------

阅读(627) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~