分享
 
 
 

C#和C++的速度大比拼(第一部分)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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 <iostream>

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#代码运行时间开销的十分之一。一般这种差别可以忽略不计。

埃拉托色尼过滤算法测试

埃拉托色尼过滤算法测试程序评估基本的整型算法和比较逻辑。这个算法历史悠久,它早在计算机出现之前就已经存在。因此用它来评估人们在各种环境中创建的算法性能具有一定的典型性或代表性。

埃拉托色尼过滤算法的C++代码如下:

代码三:sieve.cpp

#include <windows.h>

#include <iostream>

#include <algorithm>

#include <vector>

#include <cstdlib>

using namespace std;

int main(int argc, char *argv[])

{

if (argc != 2)

{

std::cerr << "Usage:\tsieve [iterations]\n";

return 1;

};

size_t NUM = atoi(argv[1]);

DWORD dw = ::GetTickCount();

vector primes(8192 + 1);

vector::iterator pbegin = primes.begin();

vector::iterator begin = pbegin + 2;

vector::iterator end = primes.end();

while (NUM--)

{

fill(begin, end, 1);

for (vector::iterator i = begin;

i < end; ++i)

{

if (*i)

{

const size_t p = i - pbegin;

for (vector::iterator k = i + p;

k < end; k += p)

{

*k = 0;

}

}

}

}

DWORD dw2 = ::GetTickCount();

std::cout << "Milliseconds = " << dw2-dw

<< std::endl;

return 0;

}

下面是埃拉托色尼过滤算法的C#代码: 代码四:

using System;

namespace Sieve

{

class Class1

{

static void Main(string[] args)

{

if (args.Length != 1)

{

Console.WriteLine("Usage:\tsieve "

"[iterations]");

return;

}

int NUM = int.Parse(args[0]);

long dt = DateTime.Now.Ticks;

int[] primes = new int[8192+1];

int pbegin = 0;

int begin = 2;

int end = 8193;

while (NUM-- != 0)

{

for (int i = 0; i < end; i++)

{

primes[i] = 1;

}

for (int i = begin; i < end; ++i)

{

if (primes[i] != 0)

{

int p = i - pbegin;

for (int k = i + p; k < end; k += p)

{

primes[k] = 0;

};

}

};

};

long dt2 = DateTime.Now.Ticks;

System.Console.WriteLine("Milliseconds = {0}",

(dt2-dt)/10000);

}

}

}

测试的结果并不足以说明那一种环境更快。在这两个语言的测试中,我旨在说明哪一种语言的构造对测试的结果影响最大。当你基于性能的考虑来选择某种语言时,应该直接考虑心需要哪种类型的性能。在这里,埃拉托色尼过滤算法测试的是循环构造以及比较逻辑和整数基本类型的处理。下面是十次测试,每次进行10000次重复的测试结果:

表二:过滤算法测试结果

序号

C++(~毫秒)

C#(~毫秒)

1

1342

2724

2

1342

2714

3

1342

2724

4

1342

2724

5

1342

2734

6

1342

2724

7

1362

2734

8

1352

2734

9

1362

2724

10

1352

2724

平均值

1348

2726

这个结果很能说明问题。整数计算C#所花的时间是C++的两倍。所以对于一个逻辑复杂的服务器来说,使用非受管C++代码比C#代码更适合。

上面的C++代码和C#代码之间有一个差别,即C#使用的是本机数组,而C++代码用的是向量模板类,我用本机数组重写了C++代码,按说应该更快。是结果不是这样,本机C++数组执行用时是1900毫秒。(待续)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有