c#与c,c++性能比较.doc_第1页
c#与c,c++性能比较.doc_第2页
c#与c,c++性能比较.doc_第3页
c#与c,c++性能比较.doc_第4页
c#与c,c++性能比较.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C#的性能到底有多差? 这篇文章带领大家来看看c#的性能问题。当然了,作为比较的选手是c/c+。首先说说测试环境:操作系统:win7 旗舰版内存:2GB硬盘:160GB处理器:Intel Pentium Dual CPU T2330 1.60GHZ本文打算基于以下几个方面讨论:1.CPU使用情况;2.内存使用情况;3.基本类型的四则运算能力;4.数学函数运算能力;5.I/O操作能力;6.数组运算能力;7.异常处理能力;8.STL vs FCL;9.算法HeapSort;10.矩阵乘;11.嵌套for循环;12.字符串连接。接下来,我们一个一个详细地说:(注,测试程序都是直接运行编译后的exe)1.CPU使用情况在程序的整个运行过程中,两者的CPU占用情况都在50%上下浮动,算是不分上下。2.内存使用情况这里列一 组程序执行过程中我记录的数据:c/c+:216kb,832kb,904kb,944kb,1336kb。c#:1972kb,1980kb,2000kb,2372kb,3024kb,5156kb。通过这组数据,不难发现,在内存使用方面c#可算是一败涂地。注:希望有人能解释下c#为什么会出现这种一路飙升的情况呢?!3.基本类型的四则运算能力费话不多说了,上代码:(注,所有的图中时间单位均为毫秒ms)c/c+的:针对int的 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 %ldn, elapsedTime, intMax);20 printf( i: %dn, i);21 printf( intResult: %dn, intResult);22 return elapsedTime;23 c#的:针对int的 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+的:针对double的 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 %.15fn, elapsedTime, doubleMin, doubleMax);20 printf( i: %fn, i);21 printf( doubleResult: %.15fn, doubleResult);22 return elapsedTime;23 c#的:针对double的 1 static long doubleArithmetic(double doubleMin, double doubleMax) 2 3 long elapsedMilliseconds; 4 double doubleResult = doubleMin; 5 double i = doubleMin; 6 7 stopwatch.Start(); 8 while (i doubleMax) 9 10 doubleResult -= i+;11 doubleResult += i+;12 doubleResult *= i+;13 doubleResult /= i+;14 15 elapsedMilliseconds = stopwatch.ElapsedMilliseconds;16 stopwatch.Reset();17 18 Console.WriteLine(Double arithmetic elapsed time: + elapsedMilliseconds + 19 ms with min of + doubleMin + , max of + doubleMax);20 Console.WriteLine( i: + i);21 Console.WriteLine( doubleResult: + doubleResult);22 return elapsedMilliseconds;23 对比结果见下图:c/c+的:针对long的 1 double longArithmetic(long long longMin, long long longMax) 2 3 double elapsedTime; 4 clock_t stopTime; 5 clock_t startTime = clock(); 6 7 long long longResult = longMin; 8 long long i = longMin; 9 while (i longMax)10 11 longResult -= i+;12 longResult += i+;13 longResult *= i+;14 longResult /= i+;15 16 17 stopTime = clock();18 elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / (double) 1000.0);19 printf(Long arithmetic elapsed time: %1.0f ms with longMax %I64dn, elapsedTime, longMax);20 printf( i: %I64dn, i);21 printf( longResult: %I64dn, longResult);22 return elapsedTime;23 c#的:针对long的 1 static long longArithmetic(long intMin, long intMax) 2 3 long elapsedMilliseconds; 4 long intResult = intMin; 5 long i = intMin; 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(long arithmetic elapsed time: + elapsedMilliseconds + 19 ms with min of + intMin + , max of + intMax);20 Console.WriteLine( i: + i);21 Console.WriteLine( intResult: + intResult);22 return elapsedMilliseconds;23 对比结果见下图:通过以上数据,发现两者对基本数据类型的操作性能差不多,属于同一个数量级。同时,注意到,c#针对int型的性能要优于c/c+。4.数学函数的运算能力c/c+的:常用数学函数 1 double trig(double trigMax) 2 3 double elapsedTime; 4 clock_t stopTime; 5 clock_t startTime = clock(); 6 7 double sine; 8 double cosine; 9 double tangent;10 double logarithm;11 double squareRoot;12 13 double i = 0.0;14 while (i trigMax)15 16 sine = sin(i);17 cosine = cos(i);18 tangent = tan(i);19 logarithm = log10(i);20 squareRoot = sqrt(i);21 i+;22 23 24 stopTime = clock();25 elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / (double) 1000.0);26 printf(Trig elapsed time: %1.0f ms with max of %1.0fn, elapsedTime, trigMax);27 printf( i: %fn, i);28 printf( sine: %.15fn, sine);29 printf( cosine: %.15fn, cosine);30 printf( tangent: %.15fn, tangent);31 printf( logarithm: %.15fn, logarithm);32 printf( squareRoot: %.15fn, squareRoot);33 return elapsedTime;34 c#的:常用数学函数 1 static long trig(double trigMax) 2 3 long elapsedMilliseconds; 4 5 double sine = 0.0D; 6 double cosine = 0.0D; 7 double tangent = 0.0D; 8 double logarithm = 0.0D; 9 double squareRoot = 0.0D; 10 double i = 0.0D;11 12 stopwatch.Start();13 while(i trigMax)14 15 sine = Math.Sin(i);16 cosine = Math.Cos(i);17 tangent = Math.Tan(i);18 logarithm = Math.Log10(i);19 squareRoot = Math.Sqrt(i);20 i+;21 22 elapsedMilliseconds = stopwatch.ElapsedMilliseconds;23 stopwatch.Reset();24 25 Console.WriteLine(Trig elapsed time: + elapsedMilliseconds + 26 ms with max of + trigMax);27 Console.WriteLine( i: + i);28 Console.WriteLine( sine: + sine);29 Console.WriteLine( cosine: + cosine);30 Console.WriteLine( tangent: + tangent);31 Console.WriteLine( logarithm: + logarithm);32 Console.WriteLine( squareRoot: + squareRoot);33 return elapsedMilliseconds;34 对比结果如下图:通过数据,我们发现c#在计算sin、cos、tan、log、sqrt等数学函数方面明显优于c/c+。大家以后注意了哦5.I/O操作能力c/c+的:写文件、读文件 1 double io(int ioMax) 2 3 double elapsedTime; 4 clock_t stopTime; 5 clock_t startTime = clock(); 6 7 FILE *stream; 8 stream = fopen(F:TestC.txt, w); 9 int i = 0;10 while (i+ ioMax)11 12 fputs(abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefghn, stream);13 14 fclose(stream);15 16 char readLine100;17 stream = fopen(F:TestC.txt, r);18 i = 0;19 while (i+ ioMax)20 21 fgets(readLine, 100, stream);22 23 fclose(stream);24 25 stopTime = clock();26 elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / (double) 1000.0);27 printf(I/O elapsed time: %1.0f ms with max of %ldn, elapsedTime, ioMax);28 printf( i: %dn, i);29 printf( readLine: %sn, readLine);30 31 return elapsedTime;32 c#的:写文件、读文件 1 static long io(int ioMax) 2 3 long elapsedMilliseconds; 4 5 String fileName = F:TestCSharp.txt; 6 String textLine = abcdefghijklmnopqrstuvwxyz1234567890abcdefghijklmnopqrstuvwxyz1234567890abcdefgh; 7 int i = 0; 8 String myLine = ; 9 10 stopwatch.Start();11 try12 13 StreamWriter streamWriter = new StreamWriter(fileName);14 while (i+ ioMax)15 16 streamWriter.WriteLine(textLine);17 18 streamWriter.Close();19 20 i = 0;21 StreamReader streamReader = new StreamReader(fileName);22 while (i+ ioMax) 23 24 myLine = streamReader.ReadLine();25 26 27 catch (IOException e)28 29 System.Console.Write(e.Message);30 31 32 33 elapsedMilliseconds = stopwatch.ElapsedMilliseconds;34 stopwatch.Reset();35 36 Console.WriteLine(IO elapsed time: + elapsedMilliseconds + 37 ms with max of + ioMax);38 Console.WriteLine( i: + i);39 Console.WriteLine( myLine: + myLine);40 return elapsedMilliseconds;41 对比结果见下图:通过数据,我们发现c#的性能略优于c/c+。6.数组运算能力c/c+的:数组基本操作 1 double array(int n) 2 3 int i, k, *x, *y; 4 5 double elapsedTime; 6 clock_t stopTime; 7 clock_t startTime = clock(); 8 x = new intn; 9 y = new intn;10 11 for (i = 0; i n; i+) 12 xi = i + 1;13 yi = 0;14 15 for (k=0; k= 0; i-) 17 yi += xi;18 19 20 21 stopTime = clock();22 elapsedTime = (stopTime - startTime) / (CLOCKS_PER_SEC / (double) 1000.0);23 printf(array elapsed time: %1.0f ms - %ld %ldn, elapsedTime, y0, yn-1);24 25 delete x;26 delete y;27 28 return elapsedTime;29 c#的:数组基本操作 1 static long array(int n) 2 3 long elapsedMilliseconds; 4 int i, j, k; 5 int x; 6 int y; 7 8 stopwatch.Start(); 9 if(n 1) n = 1;10 11 x = new intn;12 y = new intn;13 14 for (i = 0; i n; i+)15 16 xi = i + 1;17 yi = 0;18 19 for (k = 0; k = 0; j-)21 yj += xj;22 23 elapsedMilliseconds = stopwatch.ElapsedMilliseconds;24 stopwatch.Reset();25 26 Console.WriteLine(Array elapsed time: + elapsedMilliseconds + ms - + y0.ToString() + + yn-1.ToString();27 return elapsedMilliseconds;28 对比结果见下图:通过数据发现,在数组基本操作方面c#较弱(大家都能知道为什么!)。7.异常处理能力由于这部分代码稍多,所以就不在这贴了,一多后台就崩溃了(在写这篇文章其间博客园后台不知崩溃了n次,对此很无语)。后面会给出所有源码的下载地址。对比结果见下图:通过数据,发现c/c+在这方面远胜于c#,可是大家不要就此止步,再想想为什么。注:可参考Jeffrey Richter的CLR via C#中有关异常的讨论。8.STL vs FCL郁闷啊!不知道为什么,一提交网站不停地崩溃,我写的东西不停地全没。没有办法,代码就不贴了。直接上结果。这里,通过map和Dictionary的两组对比和一组Vector和List的对比。第一组对比结果见下图:这里涉及到的基本操作包括,插入和测试key是否存在。通过数据,发现c#的Dictionary的性能远远优于c/c+(10倍有余)。第二组对比结果见下图:通过数据发现c#版的字典性能远优于c/c+中的。Vector和List的对比结果见下图:通过数据发现两者性能不相上下。9.算法HeapSort对比结果见下图:通过数据发现,c/c+要优于c#(看代码发现罪魁祸首在于数组操作)。10.矩阵乘对比结果见下图:通过数据发现,c/c+的性能几乎是c#的两倍。截止到目前,我们应该知道c#在数组、矩阵操作方面是个弱项(为什么?)。大家在以后的工作学习中要学会扬长避短哦11.嵌套for循环对比结果见下图:通过数据发现,c#略差于c/c+。12.字符串连接大家都知道,字符串连接是个耗时的操作,现在让我们来看看两者的表现,对比结果见下图:令人意外的是,c#在这方面的性能要优于c/c+(几乎2倍有余)。13.总和对比这里的总和指的是前面所有项的时间加和,对比结果见下图:通过数据发现,在一般的应用中c#的性能能达到c/c+的70%-80%。作为托管代码来说这已经很不错了,你说呢?总结 写了这么多了,也许有人要问我了,你到底想说什么呢?其实,作为语言,我们要懂得什么情况下用哪个。我的观点是,精通一门,熟悉或了解另一门。怎么说呢?如果您已经工作了,那么很容易做决定,您工作中不停要用到的语言自然是您应该精通的了。如果您和我一样还是学生的话,那也很好办,凭自己的喜好呗,但不要太过执着于语言本身。比如说我,花了大量时间在c#上,今年暑假要去公司实习(大半会用到c+),所以你也要了解c+,不是吗? 现在的社会,一切都讲求速度。特别是在软件行业更是如此。软件不仅要求运行速度,很多时候更多的是开发速度,而且是第一个遇到的问题。不是有哪位大牛说过嘛,先让它run起来,再让它run地更快。结合上面的形式,一个项目中即需要懂c#的也需要懂c+的。下面的建议摘自别人的博客

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论