C#的性能到底有多差?
这篇文章带领大家来看看c#的性能问题。当然了,作为比较的选手是c/c++。
首先说说测试环境:
操作系统:win7 旗舰版
内存:2GB
硬盘:160GB
处理器:Intel Pentium Dual CPU T2330 @ 1.60GHZ
本文打算基于以下几个方面讨论:
1.CPU使用情况;
2.内存使用情况;
3.基本类型的四则运算能力;
4.数学函数运算能力;
5.I/O操作能力;
6.数组运算能力;
1.CPU使用情况
2.内存使用情况
3.基本类型的四则运算能力
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
1 double intArithmetic( ">int intMax)
2 {
3 double elapsedTime;
4 clock_t stopTime;
5 int intResult = 1 ;
6 int i = 1 ;
7
8 clock_t startTime = clock();
9 while (i < intMax)
10 {
11 intResult -= i ++ ;
12 intResult += i ++ ;
13 intResult *= i ++ ;
14 intResult /= i ++ ;
15 }
16 stopTime = clock();
17
18 elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / ( double ) 1000.0 );
19 printf( " Int arithmetic elapsed time: %1.0f ms with intMax of %ld\n " , elapsedTime, intMax);
20 printf( " i: %d\n " , i);
21 printf( " intResult: %d\n " , intResult);
22 return elapsedTime;
23 }
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
1 static long intArithmetic( int intMax)
2 {
3 long elapsedMilliseconds;
4 int intResult = 1 ;
5 int i = 0 ;
6
7 stopwatch.Start();
8 while (i < intMax)
9 {
10 intResult -= i ++ ;
11 intResult += i ++ ;
12 intResult *= i ++ ;
13 intResult /= i ++ ;
14 }
15 elapsedMilliseconds = stopwatch.ElapsedMilliseconds;
16 stopwatch.Reset();
17
18 Console.WriteLine( " Int arithmetic elapsed time: " + elapsedMilliseconds +
19 " ms with max of " + intMax);
20 Console.WriteLine( " i: " + i);
21 Console.WriteLine( " intResult: " + intResult);
22 return elapsedMilliseconds;
23 }
对比结果见下图:
c/c++的:
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
1 double doubleArithmetic( double doubleMin, double doubleMax)
2 {
3 double elapsedTime;
4 clock_t stopTime;
5 clock_t startTime = clock();
6
7 double doubleResult = doubleMin;
8 double i = doubleMin;
9 while (i < doubleMax)
10 {
11 doubleResult -= i ++ ;
12 doubleResult += i ++ ;
13 doubleResult *= i ++ ;
14 doubleResult /= i ++ ;
15 }
16
17 stopTime = clock();
18 elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / ( double ) 1000.0 );
19 printf( " Double arithmetic elapsed time: %1.0f ms with doubleMin %.15f, doubleMax %.15f\n " , elapsedTime, doubleMin, doubleMax);
20 printf( " i: %f\n " , i);
21 printf( " doubleResult: %.15f\n " , doubleResult);
22 return elapsedTime;
23 }
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
对比结果见下图:
c/c++的:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
对比结果见下图:
通过以上数据,发现两者对基本数据类型的操作性能差不多,属于同一个数量级。
同时,注意到,c#针对int型的性能要优于c/c++。
4.数学函数的运算能力
c/c++的:![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
c#的:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
对比结果如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/1ce578b24698830b51c1250d22457c5f.png)
5.I/O操作能力
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
c#的:
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
对比结果见下图:
![](https://i-blog.csdnimg.cn/blog_migrate/6a52fae5de0d5cd82a5b46f0fb352dfc.png)
6.数组运算能力
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
对比结果见下图:
![](https://i-blog.csdnimg.cn/blog_migrate/49ff81444ac3571629b38aca9ee968af.png)
7.异常处理能力
![](https://i-blog.csdnimg.cn/blog_migrate/e96fd457cc7da64e40a86c9a1d3dd2d3.png)
8.STL vs FCL
![](https://i-blog.csdnimg.cn/blog_migrate/66ddcf09a88e34de16896532c33b0e1a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4cdf67fe156f3297b7aa2481692161d0.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e1c56817dc4fddcc410b4acad339ff9c.png)
9.算法HeapSort
![](https://i-blog.csdnimg.cn/blog_migrate/7e039f2ea19aee38c85054abfa80d75a.png)
10.矩阵乘
![](https://i-blog.csdnimg.cn/blog_migrate/709173f4a6628893940b15a5cec093c0.png)
11.嵌套for循环
![](https://i-blog.csdnimg.cn/blog_migrate/dc2df3d9b64d58c116215401cf2cb1c8.png)
12.字符串连接
![](https://i-blog.csdnimg.cn/blog_migrate/04b1c8d1714f81ffb340b6370468cf0f.png)
13.总和对比
![](https://i-blog.csdnimg.cn/blog_migrate/5412b758b5ecaba4503f49bbbf6a0763.png)
总结
History repeats...!
在一个真正的软件项目中我们要做到开发速度与运行速度的折中。另外,建议大家看一下《Framework Design Guidelines, Conventions,Idioms,and Patterns
for Reusable .NET Libraries》,这本书深刻阐述了.NET的设计过程,其认真程度(包括一个命名)令人折服。
参考
- http://www.tommti-systems.de/go.html?http://www.tommti-systems.de/main-Dateien/reviews/languages/benchmarks.html
- http://www.codeproject.com/KB/cs/CSharpVsCPP.aspx
- http://msdn.microsoft.com/en-us/library/ms173196(VS.80).aspx
- http://dotnet.sys-con.com/node/46342
- http://www.techgalaxy.net/Docs/Dev/5ways.htm
注:本文基本上基于参考1写成。有兴趣的读者点击这里下载源代码。
转自:<a href="http://www.cnblogs.com/zhaoxiaowei/archive/2010/06/26/1765428.html" target="-blank"/>