日期:2009-07-17  浏览次数:20418 次

编译:藏北

    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 测试
    .NET框架的一个问题是程序的启动时间。因为.NET框架运行在Win32之上,因此要启动一个.NET框架程序需要额外的启动时间开销。
埃拉托色尼过滤算法(Sieve of Eratosthenes)测试
    这个过滤算法是一个古老的寻找素数的方法。因为开发这个算法是为人类所用,因此这个算法很占用CPU资源(非CPU优化),从而能提供非常好的基准反映人为因素。记住,编写程序的总是人。
数据库存取测试
    当今应用程序服务器往往都要用到数据库,所以我觉得用ADO.NET来测试C#的数据库存取性能与用常规ADO测试Visual C++的数据库存取性能进行比较是很能说明问题的一个好方法。
XML测试
    XML是一种最新的并且是流行的技术。因此许多人都会对用C# 和Visual C++解析XML的性能感兴趣。
    本文不打算对测试结果进行详细解释。在每一项测试中,我首先将用于测试的算法和代码列出来。然后再列出测试结果数据。最后,针对这些数据勾勒出简要的结论。
有一点在测试过程中相当重要,那就是我试图使两个环境的测试代码尽可能相同。这样可以使得测试结果更有说服力。

Hello World
    Hello World测试程序主要是评测加载一个程序及其运行时环境所用的时间。C++的程序运行需要C运行库,从所周知,这个库是相当轻量级的。而C#程序的运行必须要加载.NET框架,从目前的情况看,这个框架无庸置疑不是一个轻量级的。
Hello World程序的C++代码如下:     代码一:helloworld.cpp
    #include
    int main(int argc, char *argv[])
    {
        std::cout << "Hello World" << std::endl;
        return 0;
    };  
Hello World程序的C#代码如下:     代码二:helloworld2.cs
    using System;
    namespace HelloWorld
    {
    class Class1
    {
        static void Main(string[] args)
        {
          Console.WriteLine("Hello World");
        }
      }
    }      
    从这个测试的结果中,我们可以看到程序在相应环境中的加载时间。对于一个只完成简单任务的程序来说,无疑我们需要它能快速加载和退出。Perl脚本是个有代表性的例子,运行这种需要大量的加载时间,从而导致其不能满足基于CGI且面向性能的Web站点的需要。这时,人们常常选择C++程序替Perl脚本。但对于需要长时间处于激活状态的程序,其加载时间相对运行时性能来说就显得并不是那么很重要了。下表是十次测试的结果:
表一:Hello World 测试结果 序号 C++(~毫秒)  C#(~毫秒)
1 40  1221
2 20 121
3 10  130
4 10  100
5 10  110
6 10  130
7 10  120
8 10  140
9 10  150
10 20  140
平均值 15  235

    测试结果的精确程度由GetTickCount函数的精度决定。其精度大概在百分之一秒。从结果我们可以得出这样的结论。第一,冷启动.NET应用过程所花费的时间比运行相同的应用多出一秒的时间。第二,启动后的程序再运行时,在C++代码大约是C#代码运行时间开销的十分之一。一般这种差别可以忽略不计。

埃拉托色尼过滤算法测试
    埃拉托色尼过滤算法测试程序评估基本的整型算法和比较逻辑。这个算法历史悠久,它早在计算机出现之前就已经存