LINUX.ORG.RU
ФорумTalks

gcc всё-таки не очень sucks


0

0

Тоже решил проверить компиляторы, вот чего получилось.
Сначала linux.
$ cat 1Dint.c
#include<stdio.h>
#include<math.h>
#define eps 1e-9

double
square (double x)
{
return x * x;
};

double
integrate (double a, double b, double (*integrand) (double x))
{
if (fabs (b - a) < eps)
{
return integrand ((a + b) / 2.) * (b - a);
}
else
{
return (integrate (a, (a + b) / 2., integrand) +
integrate ((a + b) / 2., b, integrand));
};
}

int
main (void)
{
printf ("%18.15f\n", integrate (0., 1., square));
return 0;
}

$ gcc -v
Используются внутренние спецификации.
Целевая архитектура: i686-pc-linux-gnu
Параметры конфигурации: /var/tmp/portage/sys-devel/gcc-4.1.2/work/gcc-4.1.2/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.1.2 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.1.2/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/include/g++-v4 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-libunwind-exceptions --disable-multilib --disable-libmudflap --disable-libssp --disable-libgcj --enable-languages=c,c++ --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu
Модель многопотоковости: posix
gcc версия 4.1.2 (Gentoo 4.1.2)


$ gcc -O2 1Dint.c -o 1DintO2
$ time ./1DintO2
0.333333333333333

real 0m42.302s
user 0m39.514s
sys 0m0.280s

$ gcc -O3 1Dint.c -o 1DintO3
$ time ./1DintO3
0.333333333333333

real 0m28.239s
user 0m27.362s
sys 0m0.163s

$ gcc-4.2.0 -v
Используются внутренние спецификации.
Целевая архитектура: i686-pc-linux-gnu
Параметры конфигурации: /var/tmp/portage/sys-devel/gcc-4.2.0/work/gcc-4.2.0/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/4.2.0 --includedir=/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.0 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.0/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/4.2.0/info --with-gxx-include-dir=/usr/lib/gcc/i686-pc-linux-gnu/4.2.0/include/g++-v4 --host=i686-pc-linux-gnu --build=i686-pc-linux-gnu --disable-altivec --enable-nls --without-included-gettext --with-system-zlib --disable-checking --disable-werror --enable-secureplt --disable-libunwind-exceptions --disable-multilib --enable-libmudflap --disable-libssp --disable-libgcj --with-arch=i686 --enable-languages=c,c++ --enable-shared --enable-threads=posix --enable-__cxa_atexit --enable-clocale=gnu
Модель многопотоковости: posix
gcc версия 4.2.0 (Gentoo 4.2.0 p1.4)

$ time ./1DintO2
0.333333333333333

real 0m36.404s
user 0m34.244s
sys 0m0.253s

$ gcc-4.2.0 -O3 1Dint.c -o 1DintO3
$ time ./1DintO3
0.333333333333333

real 0m27.097s
user 0m25.772s
sys 0m0.153s

Далее, гружусь в непатрикоугодную альтернативную ОС, и делаю там вот что:
> cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
usage: cl [ option... ] filename... [ /link linkoption... ]

(это компилер от MSVS 2005 SP1)

>cl /O2 1Dint.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.
1Dint.c
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation. All rights reserved.
/out:1Dint.exe
1Dint.obj

>z:\Cygwin\bin\time.exe 1Dint.exe
0.333333333333333
0.00user 0.01system 1:12.74elapsed 0%CPU (0avgtext+0avgdata 109568maxresident)k
0inputs+0outputs (433major+0minor)pagefaults 0swaps

1Dint.exe больше минуты грузил процессор где-то на 98%.
На самом деле фиг знает как правильно измерить время под виндой, и какие еще флаги можно скормить cl (может подскажет кто?)

Еще, для колекции:
$ gcc -v
Reading specs from /usr/lib/gcc/i686-pc-cygwin/3.4.4/specs
Configured with: /usr/build/package/orig/test.respin/gcc-3.4.4-3/configure --verbose --prefix=/usr --exec-prefix=/usr --sysconfdir=/etc --libdir=/usr/lib --libexecdir=/usr/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-languages=c,ada,c++,d,f77,pascal,java,objc --enable-nls --without-included-gettext --enable-version-specific-runtime-libs --without-x --enable-libgcj --disable-java-awt --with-system-zlib --enable-interpreter --disable-libgcj-debug --enable-threads=posix --enable-java-gc=boehm --disable-win32-registry --enable-sjlj-exceptions --enable-hash-synchronization --enable-libstdcxx-debug
Thread model: posix
gcc version 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)

$ gcc -O2 -o 1DintO2.exe 1Dint.c
$ time ./1DintO2.exe
0.333333333333333

real 0m42.992s
user 0m41.140s
sys 0m0.062s

Deleted

сравнение под разными ос менее кошерно, чем под одной но с вайном.

zort
()

в качестве тестового кода лучше выбрать specint

zort
()
Ответ на: комментарий от anonymous

Для тех, кто писатель, а не читатель... это была абсолютно нативная виндовая прога, собранная визуалстудийным компилятором.

Deleted
()

Забавно.
Беру c-шную прогу из поста root_at_localhost и вот что получается:

$ gcc -O2 1Dint
$ time ./a.out

 0.333333333333333

real    0m40.980s
user    0m40.015s
sys     0m0.096s


$ gcc -O3 1Dint
$ time ./a.out

 0.333333333333333

real    0m26.511s
user    0m25.966s
sys     0m0.072s


Для смеха решил попробовать FreePascal:

{$MODE OBJFPC}                                                                                                                                                                     
const                                                                                                                                                                              
    Eps = 1E-7;                                                                                                                                                                    
                                                                                                                                                                                   
type                                                                                                                                                                               
    TIntegrand = function(X: double): double;                                                                                                                               
                                                                                                                                                                                   
function Square(X: double): double;                                                                                                                                    
begin                                                                                                                                                                              
    Result := X*X;                                                                                                                                                                 
end;                                                                                                                                                                               
                                                                                                                                                                                   
                                                                                                                                                                                   
function Integrate(A, B: double; Integrand: TIntegrand): double;                                       
begin                                                                                                                                                                              
    if Abs(B - A) < Eps then                                                                                                                                                       
        Result := Integrand((A + B) / 2) * (B - A)                                                                                                                                 
    else                                                                                                                                                                           
        Result := Integrate(A, (A + B) / 2, Integrand) +                                                                                                                           
                  Integrate((A + B) / 2, B, Integrand);                                                                                                                            
end;                                                                                                                                                                               
                                                                                                                                                                                   
                                                                                                                                                                                   
                                                                                                                                                                                   
begin                                                                                                                                                                              
    writeln(Integrate(0, 1, @Square):18:15);                                                                                                                                       
end. 

$ fpc -O3 1Dint.pas
Free Pascal Compiler version 2.2.0 [2007/08/30] for i386
Copyright (c) 1993-2007 by Florian Klaempfl
Target OS: Linux for i386
Compiling 1Dint.pas
Linking 1Dint
27 lines compiled, 0.4 sec
$ time ./1Dint

 0.333333333333333

real    0m1.821s
user    0m1.768s
sys     0m0.012s

Откуда такая разница?

kss ★★★★★
()
Ответ на: комментарий от Deleted

>от того, что 1e-9 и 1e-7 различаются в сто раз ;)

Упс :)))

kss ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.