Newsgroup: it.comp.os.linux.sys
Titolo: Confronto tra compilatori C/C++ tra Linux e Windows

Confronto tra compilatori C/C++ tra Linux e Windows
- Funzione C utilizzata per il test
	int f(int n)
	{
	    return n ? 1 : 0;
	}
- Compilatore GNU C/C++ compiler 2.95 (Linux)
Linea di comando:
  gcc-2.95 -finline-functions -march=pentiumpro -O2 -S 
           -fverbose-asm 
 
  -finline-functions      	inline functions
  -march=pentiumpro 		compililer for Pentium Pro
  -O2 				optimize for spedd
  -S 				assembler output
  -fverbose-asm 		verbose assembler
Assembler generato:
	.globl f
		.type	f,@function
	f:
		pushl 	%ebp
		movl 	%esp,%ebp
		cmpl 	$0,8(%ebp)
		setne 	%al
		movzbl 	%al,%eax
		movl 	%ebp,%esp
		popl 	%ebp
		ret
- Compilatore GNU C/C++ 3.2 (Linux)
Linea di comando:
  gcc-3.2 -finline-functions -march=pentiumpro -O2 -S 
          -fverbose-asm 
 
  -finline-functions      	inline functions
  -march=pentiumpro 		compililer for Pentium Pro
  -O2 				optimize for spedd
  -S 				assembler output
  -fverbose-asm 		verbose assembler
Assembler generato:
 
	.globl f
		.type	f,@function
	f:
		pushl	%ebp
		movl		%esp, %ebp
		xorl		%eax, %eax
		cmpl		$0, 8(%ebp)	#  n
	     popl		%ebp
		setne	%al
		ret
con l'aggiunta dell'opzione "-fomit-frame-pointer":
	.globl f
	      .type   	f,@function
	f:
	      xorl    	%eax, %eax
	      cmpl    	$0, 4(%esp)    #  n
	      setne   	%al
	      ret
- Compilatore Borland C/C++ compiler Kylix3 (Linux)
Linea di comando:
  bc++ -vi -6 -O2 -S
 
  -vi   	inline functions
  -6    	generate Pentium Pro instructions
  -O2   	optimize for max speed
  -S    	assembler output
Assembler generato:
     1		 ;	int f(int n)
     2		 ;	
     3			push      ebp
     4			mov       ebp,esp
     5		 ;	{
     6		 ;	    return n ? 1 : 0;
     7			cmp       dword ptr [ebp+8],0
     8			je        short @2
     9			mov       eax,0                 
    10			jmp 		short @4
    11		@2:
    12			xor       eax,eax
    13		 ;	
    14		 ;	}
    15		 ;	
    16		@4:
    17		     pop       ebp
    18		     ret
 
nella riga 9 assembler è sbagliato, dovrebbe essere "mov  eax, 1". Nel
disassember del binario  generato  invece compare  il  codice giusto ?
- Compilatore MS-VisualC 6 (Windows)
Linea di comando:
  cl /O2 /Oi /G6 /FA
  /O2 	maximize speed
  /Oi 	enable intrinsic functions
  /G6 	optimize for Pentium Pro
  /FA 	assembly listing
Assembler generato:
	_f	PROC NEAR				
	; Line 7
		mov	ecx, DWORD PTR _n$[esp-4]
		xor	eax, eax
		test	ecx, ecx
		setne	al
	; Line 8
		ret	0
- Conclusioni
I test e' limitato ma significativo.
La funzione non  e' stata scelta a caso. Per  poterla ottimizzarla serve
una conoscenza particolare delle istruzioni del Pentium.
Il  migliore codice  risulta essere  quello  del MS  VisualC, mentre  il
peggiore e' quello della Borland.
Il nuovo  gcc della GNU  genera un buon  codice piazzando il  gcc-3.2 al
secondo posto e  il gcc-2.95 riesce a generare il  codice senza salto ma
si perde nella coversione.
Da notare l'interlacciamento del codice che viene fatto del MS VisualC e
dal gcc-3.2 senza il frame-pointer abilitato.
Il compilatore Borland C/C++ generando un codice adatto alle vecchie CPU
8088/86 ignorando l'opzione per generare il codice per il PentiumPRO. 
-- 
Mario Ambrogetti  mailto:
ma...@assi.polito.it
Torino Italy      
http://www.polito.it/~s65710

Confronto tra compilatori C/C++ tra Linux e Windows
Dovresti provare l' icl 7 per linux... ^__^
 ==> Atlantis <==
 Icq # 18752702
 
http://thenomad.homeip.net
 (now online)
A.T.L.A.N.T.I.S.: Artificial Transforming Lifeform Assembled for Nocturnal Troubleshooting and Intensive Sabotage

 peggiore e' quello della Borland.
Cioč: M$ozz ha fatto qualcosa di buono?
E' questo che vuoi dire?
Max

 ha scritto:

Miiii! Siamo polemici? :-))) -- 
Antonio   @=D

 8088/86 ignorando l'opzione per generare il codice per il PentiumPRO. 
Magari finito col C e gli OT ci si potrebbe interessare un attimo
anche all'italiano?