C++编译器机能较量
当前位置:以往代写 > C/C++ 教程 >C++编译器机能较量
2019-06-13

C++编译器机能较量

C++编译器机能较量

副标题#e#

此刻市面上,主流的C/C++编译器包罗M$的CL、gcc、Intel的icl、PGI的pgcc及Codegear的bcc(本来属于Borland公司)。Windows上利用最多的自然是cl,而在更辽阔的平台上,gcc则是C/C++编译器的首选。但要提到本领优化,排名就未必与它们的市场占有率一致了。

本日一时鼓起,便做了一个各编译器数值机能的较量。测试的代码是一个求积分的措施,来历于intel编译器的例子措施,修改了一个头文件,以便每个编译器都能编译。

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

// Function to be integrated
// Define and prototype it here
// | sin(x) |
#define INTEG_FUNC(x) fabs(sin(x))

// Prototype timing function
double dclock(void);

int main(void)
{
// Loop counters and number of interior points
unsigned int i, j, N;
// Stepsize, independent variable x, and accumulated sum
double step, x_i, sum;
// Timing variables for evaluation
double start, finish, duration, clock_t;
// Start integral from
double interval_begin = 0.0;
// Complete integral at
double interval_end = 2.0 * 3.141592653589793238;

// Start timing for the entire application
start = clock();

printf(" \n");
printf(" Number of | Computed Integral | \n");
printf(" Interior Points | | \n");
for (j=2;j<27;j++)
{
printf("------------------------------------- \n");

// Compute the number of (internal rectangles + 1)
N = 1 << j;

// Compute stepsize for N-1 internal rectangles
step = (interval_end - interval_begin) / N;

// Approx. 1/2 area in first rectangle: f(x0) * [step/2]
sum = INTEG_FUNC(interval_begin) * step / 2.0;

// Apply midpoint rule:
// Given length = f(x), compute the area of the
// rectangle of width step
// Sum areas of internal rectangle: f(xi + step) * step

for (i=1;i<N;i++)
{
x_i = i * step;
sum += INTEG_FUNC(x_i) * step;
}

// Approx. 1/2 area in last rectangle: f(xN) * [step/2]
sum += INTEG_FUNC(interval_end) * step / 2.0;

printf(" %10d | %14e | \n", N, sum);
}
finish = clock();
duration = (finish - start);
printf(" \n");
printf(" Application Clocks = %10e \n", duration);
printf(" \n");

return 0;
}


#p#副标题#e#

虽然,这个代码来自于intel,虽然很是适合intel的编译器。以下的测试在Intel Core 2 Duo长举办。

gcc (GCC TDM-2 for MinGW) 4.3.0 VC 9.0 (cl 15.00.21022.08) Intel (icl 10.1) PGI (pgcc 7.16) CodeGear (bcc32 6.10)

克制优化

-O0 /Od -Od -O0 -Od

17161 14461 12441 10514 13400

17133 14430 11687 9956 12917

17155 14476 11871 10099 13026

编译选项 -O2

13011 7737 4540 9348 12636

16571 7706 4185 9148 13026

16573 7706 4042 9183 13057

针对平台的优化

-march=core2 -O2 /arch:SSE2 /O2 -QxT -tp core2 -O2 无

16060 7710 1938 9578

测试的功效说明,在数值计较要领,intel的编译器长短常好坏的,出格是针对某CPU的优化,能提高许多机能。GCC表示却有些让人失望。在克制优化到-O2级优化的比拟中,可以看出intel与m$的编译器的优化结果长短常明明的,而其它编译器优化后的提高很是有限。假如给个排名,那么将是 icl>cl>pgcc>bcc>gcc.

别的,在一台P4 1.5G的呆板,linux情况下,测试获得

gcc icc pgCC

-O2 -O2 -O2

24920000 10840000 22270000

-O0 -O0 -O0

28290000 19210000 24320000

-march=pentium4 -O2 -xN -tp piv -O2

24990000 6640000 22150000

同样,照旧intel的表示最好,而gcc最差。

又在Athlon X2 4800+, Linux上测试,获得下表

gcc icc pgcc

-O0 -O0 -O0

9390000 14950000 9950000

-O2 -O2 -O2

8910000 9240000 9400000

-march=amdfam10 -O2 -msse3 -O2 -tp k8-32 -O2

8800000 3800000 9030000

固然icc主要是针对intel的处理惩罚器,但只要优化选项找对,同样能带给amd cpu机能的庞大提高。gcc也回归到普通程度。奇怪的是pgi的编译器,预计是我还没找到好的选项吧。

总结看来,在数值计较要领,“最快”的选择应该属于intel.

    关键字:

在线提交作业