在下面的網址:http://www.BkJia.com/kf/201111/112209.html 看到了使用MS的CL、gcc、Intel的icl、PGI的pgcc及Codegear的bcc 幾個不同編譯器編譯的C/C++ 程序性能對比,結論是Intel的編譯器性能最高。
同樣把這段Intel的SDK中的代碼遷移到C#中比較一下
我的筆記本是:Intel Core4 P8700 2.53G的CPU,4G內存,Win7 64bit系統,VS2010自帶的編譯器
對於代碼略作調整和注釋
C++代碼
01 //intel的性能測試例子
02 #include <stdio.h>
03 #include <stdlib.h>
04 #include <time.h>
05 #include <math.h>
06
07 //為cin cout 提供
08 #include <iostream>
09 using namespace std;
10
11 #define INTEG_FUNC(x) fabs(sin(x)) //計算公式
12
13 double dclock(void);
14
15 int main(void)
16 {
17 unsigned int i, j, N;
18 double step, x_i, sum;
19 double start, finish, duration, clock_t;
20 double interval_begin = 0.0;
21 double interval_end = 2.0 * 3.141592653589793238;
22
23 start = clock(); //初始時間
24
25 printf(" \n");
26 printf(" Number of中文| Computed Integral | \n"); //Win7下中文顯示正常
27 printf(" Interior Points | | \n");
28
29 for (j=2;j<27;j++)
30 {
31 N = 1 << j;
32
33 step = (interval_end - interval_begin) / N;
34 sum = INTEG_FUNC(interval_begin) * step / 2.0;
35
36 for (i=1;i<N;i++)
37 {
38 x_i = i * step;
39 sum += INTEG_FUNC(x_i) * step;
40 }
41
42 sum += INTEG_FUNC(interval_end) * step / 2.0;
43
44 //printf(" %10d | %14e | \n", N, sum);
45 printf(" %14e \n", sum);
46 }
47
48 finish = clock(); //結束時間
49 duration = (finish - start);
50 printf(" \n");
51 printf(" Application Clocks = %10e \n", duration);
52 printf(" \n");
53
54 int tempA;
55 cin>>tempA;
56
57 return 0;
58 }
默認編譯參數,都是Release編譯後,拿出exe文件獨立運行
32bit C++ 6338ms
C# 代碼
01 using System;
02 using System.Collections.Generic;
03 using System.Linq;
04 using System.Text;
05
06 namespace ConsoleApplication1
07 {
08 class Program
09 {
10 static void Main(string[] args)
11 {
12 int time = System.Environment.TickCount; //添加計時器
13
14 #region
15 int i, j, N;
16 double step, x_i, sum;
17 double start, finish, duration, clock_t;
18 double interval_begin = 0.0;
19 double interval_end = 2.0 * 3.141592653589793238;
20
21 for (j = 2; j < 27; j++)
22 {
23 N = 1 << j;
24 step = (interval_end - interval_begin) / N;
25 sum = Math.Abs(Math.Sin(interval_begin)) * step / 2.0;
26
27 for (i = 1; i < N; i++)
28 {
29 x_i = i * step;
30 sum += Math.Abs(Math.Sin(x_i)) * step;
31 }
32
33 sum += Math.Abs(Math.Sin(interval_end)) * step / 2.0;
34 Console.Write(sum.ToString()+"\r\n");
35 }
36
37 Console.Write((System.Environment.TickCount - time).ToString());
38 Console.ReadLine();
39 #endregion
40 }
41 }
42 }
32bit C# 命令行 5382ms
32bit C# WinForm 5351ms
都是重復測試了5次,最大最小誤差少於30ms
從左到依次為:32bit C++、32bit C#命令行、32bit C#WinForm
C#的竟然比C++快了1秒。
再看看64bit的,64bit C++ 3696ms,64bit C# 5382 ms
從左到右依次為:
64bit C++,32bitC++,64bit C#
可見該程序64bit 編譯時,C++的性能大幅提升,C#的幾乎不變。
兩個計算精度應該相同,C++是因為輸出的格式科學計數法隱藏了後面的小數
結論:
1. C# 在WinForm和命令行中,數學計算性能相當
2. 32bit下C#的性能還不錯,若能在64bit下編譯器也能充分優化達到C++那樣的提升就好了。
楊韬的學習備忘錄YTYT2002YTYT
http://www.cnblogs.com/ytyt2002ytyt/archive/2011/11/24/2261104.html