Компилятор pcc в 5 раз быстрее gcc

Не так давно проходила инфоромация что ядро OpenBSD хотят перевести на более быстрый и менее GNUтый компилятор pcc, правда, почему-то перевели на gcc-4 :)
Я сравнил pcc (current 23.10.2010) и gcc-3.3.5 на сборке самого себя на старенькой машине (для наглядности):

# dmesg
OpenBSD 4.5-stable (GENERIC) #9: Sat Sep 25 09:09:02 MSD 2010
root@serv.kmv:/usr/src/sys/arch/i386/compile/GENERIC
cpu0: Intel Pentium/MMX ("GenuineIntel" 586-class) 167 MHz
cpu0: FPU,V86,DE,PSE,TSC,MSR,MCE,CX8,MMX
real mem = 66678784 (63MB)
avail mem = 57143296 (54MB)
...
# cd /root/src/pcc
# time env CC=gcc ./configure
checking build system type... i386-unknown-openbsd4.5
checking host system type... i386-unknown-openbsd4.5
checking target system type... i386-unknown-openbsd4.5
checking for gcc... gcc
... ...
Configure finished. Do 'make && make install' to compile and install.

1m18.37s real 0m32.02s user 0m22.25s system

# time make
cd cc && make all
cd cc; make all
gcc -DLIBEXECDIR=\"/usr/local/libexec/\" -DGCC_COMPAT -DINCLUDEDIR=\"/usr/local/include/\"
... ...
gcc -g -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wsign-compare optim.o pftn.o scan.o trees.o cgram.o inline.o symtabs.o gcc_compat.o init.o local.o code.o stabs.o builtins.o match.o reader.o optim2.o regs.o local2.o order.o table.o compat.o common.o main.o external.o -o ccom
5m32.17s real 3m48.63s user 0m11.13s system

# make clean
... ...

# time env CC=pcc ./configure
checking build system type... i386-unknown-openbsd4.5
checking host system type... i386-unknown-openbsd4.5
checking target system type... i386-unknown-openbsd4.5
checking for gcc... pcc
... ...
0m52.09s real 0m16.66s user 0m20.26s system

# time make
cd cc && make all
cd cc; make all
pcc -DLIBEXECDIR=\"/usr/local/libexec/\" -DGCC_COMPAT -DINCLUDEDIR=\"/usr/local/include/\"
... ...
pcc -g -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wsign-compare -Wtruncate optim.o pftn.o scan.o trees.o cgram.o inline.o symtabs.o gcc_compat.o init.o local.o code.o stabs.o builtins.o match.o reader.o optim2.o regs.o local2.o order.o table.o compat.o common.o main.o external.o -o ccom
1m6.87s real 0m41.78s user 0m5.85s system
#
1m6.87s против 5m32.17s, так что рекомендую..
Понятно, что этот тест не всеобъемлющий, но ускорение в разы гарантировано.

Аватар пользователя time2die

скорость

скорость компиляции это хорошо, когда ты девелопер, и часто собираешь продукт для тестов, но лично меня больше интересует скорость работы самого продукта

Аватар пользователя MikeKMV

Это больше

Это больше вопрос к библиотекам (libc то старая системная..), хотя тоже неплохо бы тест сделать.
_____________
Нет более кривого инструмента, чем GNU-тый инструмент.

_____________
Нет более кривого инструмента, чем GNU-тый инструмент.

Аватар пользователя Eudgen

На amd64 сам себя

На amd64 сам себя он не собрал:

pcc -DLIBEXECDIR=\"/usr/local/libexec/\" -DGCC_COMPAT -DINCLUDEDIR=\"/usr/local/include/\" -DPCCINCDIR=\"/usr/local/lib/pcc/x86_64-unknown-openbsd4.7/0.9.9/include/\" -DPCCLIBDIR=\"/usr/local/lib/pcc/x86_64-unknown-openbsd4.7/0.9.9/lib/\" -Dos_openbsd -DTARGMACH=amd64 -Dmach_amd64 -I../.. -I../../os/openbsd -I../../mip -I../../arch/amd64 -g -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wsign-compare -Wtruncate -c cc.c
/usr/include//stdio.h, line 377: warning: conversion to 'unsigned char' from 'int' may alter its value
cc.c, line 1076: warning: conversion to 'int' from 'long' may alter its value
cc.c, line 1221: warning: conversion to 'int' from 'long' may alter its value
cc.c, line 1366: warning: conversion to 'int' from 'long' may alter its value
/tmp/ctm.qJhfhF: Assembler messages:
/tmp/ctm.qJhfhF:4770: Error: `3(%eax)' is not a valid 64 bit base/index expression
/tmp/ctm.qJhfhF:5927: Error: `(%r13d,%ebx)' is not a valid 64 bit base/index expression
*** Error code 1

Stop in /home/eudgen/test/2/cc/cc (line 92 of /usr/share/mk/sys.mk).
*** Error code 1

Stop in /home/eudgen/test/2/cc (line 37 of Makefile).
*** Error code 1

Stop in /home/eudgen/test/2 (line 32 of Makefile).

Аватар пользователя ENcrypted

В том то вся и

В том то вся и проблема что сыроват пцц ешо. Поэтому гцц4 и задейсвовано в деле.

Аватар пользователя MikeKMV

Текущая версия pcc-1

Текущая версия pcc 1.0 или 1.1.0 (сам компилятор пишет: pcc 1.1.0.DEVEL 20110221 for x86_64)
1.0 Release The first release of pcc for decades (21 feb 2011)
уже прекрасно справляется со сборкой самого себя на amd64:
# dmesg
OpenBSD 4.9 (GENERIC.MP) #11: Mon Mar 28 09:54:51 MSD 2011
root@serv2.kmv:/usr/src/sys/arch/amd64/compile/GENERIC.MP
real mem = 3149791232 (3003MB)
avail mem = 3051921408 (2910MB)
mainbus0 at root
bios0 at mainbus0: SMBIOS rev. 2.4 @ 0xf0100 (38 entries)
bios0: vendor Award Software International, Inc. version "F4" date 11/04/2009
bios0: Gigabyte Technology Co., Ltd. EG41MF-US2H
...
cpu0 at mainbus0: apid 0 (boot processor)
cpu0: Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz, 2397.20 MHz
cpu0: FPU,VME,DE,PSE,TSC,MSR,PAE,MCE,CX8,APIC,SEP,MTRR,PGE,MCA,CMOV,PAT,PSE36,CFLUSH,DS,ACPI,MMX,FXSR,SSE,SSE2,SS,HTT,TM,SBF,SSE3,MWAIT,DS-CPL,VMX,EST,TM2,SSSE3,CX16,xTPR,PDCM,NXE,LONG
cpu0: 4MB 64b/line 16-way L2 cache
cpu0: apic clock running at 266MHz
cpu1 at mainbus0: apid 1 (application processor)
cpu1: Intel(R) Core(TM)2 CPU 6600 @ 2.40GHz, 2396.87 MHz
...
# gcc -v
Reading specs from /usr/bin/../lib/gcc-lib/amd64-unknown-openbsd4.9/4.2.1/specs
Target: amd64-unknown-openbsd4.9
Configured with: OpenBSD/amd64 system compiler
Thread model: posix
gcc version 4.2.1 20070719
# pwd
/root/src/pcc
# time ./configure
checking build system type... x86_64-unknown-openbsd4.9
...
Target CPU is .................... amd64
Target ABI is .................... elf
Target OS is ..................... openbsd
Compiler is called ............... pcc
Installing compiler into ......... /usr/local/bin
Installing pre-processor into .... /usr/local/libexec
Using assembler ..................
Using linker .....................
Using include path ...............
Using library path ...............
Has TLS support .................. no
Has GCC compatibility ............ yes
Type of wchar_t is ............... INT (4 chars)

Configure finished. Do 'make && make install' to compile and install.

0m7.04s real 0m1.67s user 0m1.42s system
# time make
cd cc && make all
cd cc; make all
gcc -DLIBEXECDIR=\"/usr/local/libexec/\" -DGCC_COMPAT -DINCLUDEDIR=\"/usr/local/include/\" -DPCCINCDIR=\"/usr/local/lib/pcc/x86_64-unknown-openbsd4.9/1.1.0.DEVEL/include/\" -DPCCLIBDIR=\"/usr/local/lib/pcc/x86_64-unknown-openbsd4.9/1.1.0.DEVEL/lib/\" -Dos_openbsd -DTARGMACH=amd64 -Dmach_amd64 -I../.. -I../../os/openbsd -I../../mip -I../../arch/amd64 -g -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wsign-compare -c cc.c
...
gcc -g -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wsign-compare optim.o pftn.o scan.o trees.o cgram.o inline.o symtabs.o gcc_compat.o init.o local.o code.o stabs.o builtins.o match.o reader.o optim2.o regs.o local2.o order.o table.o compat.o common.o main.o external.o -o ccom
0m11.14s real 0m9.68s user 0m0.84s system
# make install
...
# pcc -v
pcc 1.1.0.DEVEL 20110221 for x86_64-unknown-openbsd4.9, root@serv2.kmv
# ls -la /usr/local/bin/pcc*
-rwxr-xr-x 1 root wheel 24408 Mar 28 10:12 /root/pcc

итого 11.14сек, теперь тоже самое, но уже самим pcc, правда собранным gcc-4:
# make distclean
...
# time ./configure CC=pcc
...
Target CPU is .................... amd64
Target ABI is .................... elf
Target OS is ..................... openbsd
Compiler is called ............... pcc
Installing compiler into ......... /usr/local/bin
Installing pre-processor into .... /usr/local/libexec
Using assembler ..................
Using linker .....................
Using include path ...............
Using library path ...............
Has TLS support .................. no
Has GCC compatibility ............ yes
Type of wchar_t is ............... INT (4 chars)

Configure finished. Do 'make && make install' to compile and install.

0m4.58s real 0m0.62s user 0m1.21s system
# time make
cd cc && make all
cd cc; make all
pcc -DLIBEXECDIR=\"/usr/local/libexec/\" -DGCC_COMPAT -DINCLUDEDIR=\"/usr/local/include/\" -DPCCINCDIR=\"/usr/local/lib/pcc/x86_64-unknown-openbsd4.9/1.1.0.DEVEL/include/\" -DPCCLIBDIR=\"/usr/local/lib/pcc/x86_64-unknown-openbsd4.9/1.1.0.DEVEL/lib/\" -Dos_openbsd -DTARGMACH=amd64 -Dmach_amd64 -I../.. -I../../os/openbsd -I../../mip -I../../arch/amd64 -g -O2 -Wall -Wmissing-prototypes -Wstrict-prototypes -Wshadow -Wsign-compare -Wtruncate -c cc.c
/usr/include//stdio.h:377: warning: conversion to 'unsigned char' from 'int' may alter its value
...
0m2.36s real 0m1.68s user 0m0.32s system
# make install
...
# ls -la /usr/local/bin/pcc*
-rwxr-xr-x 1 root wheel 23792 Mar 28 10:16 /usr/local/bin/pcc

2.36сек, проделаем то же самое, но уже pcc, собраным им самим:
# make distclean
...
# make distclean
...
# time ./configure CC=pcc
...
Configure finished. Do 'make && make install' to compile and install.

0m4.65s real 0m0.65s user 0m1.49s system
# time make
cd cc && make all
cd cc; make all
pcc -DLIBEXECDIR=\"/usr/local/libexec/\" -DGCC_COMPAT -DINCLUDEDIR=\"/usr/local/include/\" -DPCCINCDIR=\"/usr/local/lib/pcc/x86_6
...
0m2.96s real 0m2.21s user 0m0.40s system
# ls -la /usr/local/bin/pcc*
-rwxr-xr-x 1 root wheel 23792 Mar 28 11:02 /usr/local/bin/pcc
Уже 2.96сек
Резюме:
pcc-1 (собранный gcc-4) быстрее, чем gcc-4 в 11.14/2.36=4,7 раза
pcc-1 (собранный уже самим pcc-1) быстрее, чем gcc-4 в 11.14/2.96=3,7 раза
pcc-1 (собранный gcc-4) быстрее, чем pcc-1 (собранный pcc-1) в 2.96/2.36=1,25 раза
Таким образом, pcc работает в 3,7-4,7 раза быстрее gcc-4, но сгенерированный им код медленнее примерно на четверть (естесственно, это все верно только для исходников pcc, на которых производился эксперимент). Размеры исполняемых файлов отличаеются мало gcc: 24408 pcc: 23792, на других проектах эти компиляторы давали обратную разницу в размерах.
PS: для статистики я повторил эксперимент, получились времена для этих трех случаев, соответственно: 10.93/2.37/2.92 сек, во всех случаях машина ничем не была загружена, кроме ssh через который производился доступ.

_____________
Нет более кривого инструмента, чем GNU-тый инструмент.