Desempenho Java x C

mais um teste, agora com C++

codigo C++:

#define LOOP 100000000
class teste{
 int x;
 public:
  teste(): x(0){}
};
int main(){
 teste *t;
 for (int i = 0; i < LOOP; i++){
  t = new teste();
  delete(t);
 }
}

codigo Java:

public class Teste{
 private static final int LOOP = 100000000;
 public static void main(String args[]){
  X x;
  for (int i = 0; i < LOOP; i++){
   x = new X();
  }
 }
}
class X{
 private int x;
 public X(){
  x = 0;
 }
}

resultado:

Ja que todos estavam fazendo o seu, resolvi eu tambem fazer meu teste.
. Não utilizei nenhum tipo de otimização.
. Não utilizei relógio, acho mais fácil calcular o tempo dentro do próprio programa.
. Não peguei nenhum programa listado aqui anteriormente, até porque existiam aqui alguns que nem compilavam ou tinha excessões que não eram tratadas.

Os dados que encontrei estão ai e espero que ajude a quem precise desta informação.

Java e C são linguagens de programação que tem seus devidos propósitos. Ao invés desta discução que ja dura cerca de nove paginas e não chega a lugar nenhum, porque não discutir quais propósitos que uma ou outra melhor se aplica.
Eu pelo menos não pretendo deixar de programar em uma linguagem ou outra por motivo de uma deficiencia encontrata em uma ou outra linguagem.
Guerra santa todos sabemos como acabam.

Sujestão:
Vamos aproveitar o forum para avaliar um código, talvez o proposto abaixo ou outro qualquer (que compile), vamos executar cada um em nossa própria maquina e postar os resutados, se assim vocês ficarem felizes, vamos controlar o tempo via o próprio programa, sabe como é não confio em relogio que eu não estou vendo.
Então quem sabe depois postamos os resultados, geramos uma planilha, quem sabe até usamos a do exell ou calc (openoffice) e chegamos a um resultado mais preciso.
Mesmo assim todos continuarão trabalhando e usando suas linguagens para seus devidos propósitos e então haverá paz na terra aos programadores de boa vontade novamente.

Agradecimentos especiais :
A Galera la do trabalho, que apesar desta guerra santa consegue tocar as coisas na esportiva e cumprir seus prazo cada um com sua especialidade e Tbem ao Cassio que deu uma força com um código legal para o teste.

Uma observação quanto ao propósito de uso de uma linguagem:
O forum do portaljava que tem mensagens como “o php nunca vai ser tão bom quanto o java” é feito em PHP

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

#define LIMIT 200000

static void qsort_b(int *c,int start,int end){
	int comp = c[start], tmp;
	int i = start,j = end + 1;
	if(end <= start) return;
	for(;;){
		do i++; while(i<end && c[i]<comp);
		do j--; while(j>start && c[j]>comp);
		if(j <= i)   break;
		tmp = c[i];
		c[i] = c[j];
		c[j] = tmp;
	}
	c[start] = c[j];
	c[j] = comp;
	qsort_b(c,start,j-1);
	qsort_b(c,j+1,end);
}

static void qsort_a(int *c){
	printf("Ordenando...\n");
	qsort_b(c,0,LIMIT-1);
}

int main(int argc, char **argv){
	int i;
	int arr[LIMIT];
	time_t stm, etm;

	for(i=0;i<LIMIT;i++){
		arr[i] = rand();
	}

	printf("Programa Carregado... \n");

	time(&stm);
	qsort_a(arr);
	time(&etm);
	printf("Time =  %ld\n", (etm -stm) );

/*
	for(i=0;i<LIMIT;i++)
		printf("%d ", arr[i]);

	printf("\nDone ;-)\n");
*/

	return 0;
}

public class pSimpleQuicksort {

	private static final int LIMIT = 200000;

	public static void qsort(Comparable[] c,int start,int end){
		if(end <= start) return;
		Comparable comp = c[start];
		int i = start,j = end + 1;
		for(;;){
			do i++; while(i<end && c[i].compareTo(comp)<0);
			do j--; while(j>start && c[j].compareTo(comp)>0);
			if(j <= i)   break;
			Comparable tmp = c[i];
			c[i] = c[j];
			c[j] = tmp;
		}
		c[start] = c[j];
		c[j] = comp;
		qsort(c,start,j-1);
		qsort(c,j+1,end);
	}

	public static void qsort(Comparable[] c){
		System.out.println("Ordenando...");
		qsort(c,0,c.length-1);
	}

	public static void main(String[] args){
		int i;
		Integer[] arr = new Integer[LIMIT];

		for(i=0;i<arr.length;i++){
			arr[i] = new Integer((int)(Math.random()*99));
		}

		System.out.println("Programa Carregado... \n");

		double time1 = System.currentTimeMillis();
		pSimpleQuicksort.qsort(arr);
		double time2 = System.currentTimeMillis();
		System.out.println("Time =  " + (time2 -time1) );

/*
		for(i=0;i<arr.length;i++)
			System.out.print(arr[i]+" ");

			System.out.println("\nDone ;-)");
*/
	}
}

Maquina : Sun-Blade-100
SO: SunOS 5.9
Cpu Type: sparcv9
FPU Type: sparcv9
Mhz: 502
Memoria: 256MB

for ((i=0; i<5; i++)) ; do
> time ./pSimpleQuicksort
> done
Programa Carregado…
Ordenando…
Time = 0

real 0m0.478s
user 0m0.360s
sys 0m0.020s
Programa Carregado…
Ordenando…
Time = 0

real 0m0.487s
user 0m0.370s
sys 0m0.020s
Programa Carregado…
Ordenando…
Time = 0

real 0m0.488s
user 0m0.390s
sys 0m0.010s
Programa Carregado…
Ordenando…
Time = 0

real 0m0.419s
user 0m0.390s
sys 0m0.020s
Programa Carregado…
Ordenando…
Time = 0

real 0m0.470s
user 0m0.370s
sys 0m0.010s

[ tmp]$ java131
[ tmp]$ javac pSimpleQuicksort.java
[ tmp]$ for ((i=0; i<5; i++)) ; do time java pSimpleQuicksort; done
Programa Carregado…

Ordenando…
Time = 1007.0

real 0m2.092s
user 0m1.680s
sys 0m0.250s
Programa Carregado…

Ordenando…
Time = 1025.0

real 0m2.080s
user 0m1.730s
sys 0m0.240s
Programa Carregado…

Ordenando…
Time = 979.0

real 0m1.990s
user 0m1.710s
sys 0m0.210s
Programa Carregado…

Ordenando…
Time = 971.0

real 0m1.979s
user 0m1.630s
sys 0m0.280s
Programa Carregado…

Ordenando…
Time = 976.0

real 0m2.000s
user 0m1.630s
sys 0m0.260s

[ tmp]$ java142
[ tmp]$ javac pSimpleQuicksort.java
[ tmp]$ for ((i=0; i<5; i++)) ; do time java pSimpleQuicksort; done
Programa Carregado…

Ordenando…
Time = 950.0

real 0m2.216s
user 0m1.680s
sys 0m0.150s
Programa Carregado…

Ordenando…
Time = 916.0

real 0m1.923s
user 0m1.710s
sys 0m0.130s
Programa Carregado…

Ordenando…
Time = 949.0

real 0m1.986s
user 0m1.690s
sys 0m0.150s
Programa Carregado…

Ordenando…
Time = 927.0

real 0m1.960s
user 0m1.750s
sys 0m0.120s
Programa Carregado…

Ordenando…
Time = 992.0

real 0m2.000s
user 0m1.750s
sys 0m0.170s

[ tmp]$ java150
[ tmp]$ javac pSimpleQuicksort.java
Note: pSimpleQuicksort.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[ tmp]$ for ((i=0; i<5; i++)) ; do time java pSimpleQuicksort; done
Programa Carregado…

Ordenando…
Time = 1204.0

real 0m3.030s
user 0m2.140s
sys 0m0.190s
Programa Carregado…

Ordenando…
Time = 1212.0

real 0m2.439s
user 0m2.140s
sys 0m0.160s
Programa Carregado…

Ordenando…
Time = 1153.0

real 0m2.370s
user 0m2.100s
sys 0m0.190s
Programa Carregado…

Ordenando…
Time = 1168.0

real 0m2.389s
user 0m2.050s
sys 0m0.220s
Programa Carregado…

Ordenando…
Time = 1153.0

real 0m2.420s
user 0m2.050s
sys 0m0.220s


Maquina : i386
SO: Linux (kernel 2.4.18-3)
Cpu Type: Intell Pentium II
FPU Type: Intell Pentium II
Mhz: 350
Memoria: 256MB

processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 5
model name : Pentium II (Deschutes)
stepping : 2
cpu MHz : 349.201
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 sep mtrr pge mca cmov pat pse36 mmx fxsr
bogomips : 696.32

[pleao@Hipolitta tmp]$ for ((i=0; i<5; i++)) ; do time ./pSimpleQuicksort ; done
Programa Carregado…
Ordenando…
Time = 0

real 0m0.370s
user 0m0.340s
sys 0m0.000s
Programa Carregado…
Ordenando…
Time = 0

real 0m0.362s
user 0m0.330s
sys 0m0.000s
Programa Carregado…
Ordenando…
Time = 1

real 0m0.364s
user 0m0.330s
sys 0m0.020s
Programa Carregado…
Ordenando…
Time = 0

real 0m0.364s
user 0m0.350s
sys 0m0.010s
Programa Carregado…
Ordenando…
Time = 0

real 0m0.366s
user 0m0.350s
sys 0m0.000s
[pleao@Hipolitta tmp]$ for ((i=0; i<5; i++)) ; do time java pSimpleQuicksort ; done
Programa Carregado…

Ordenando…
Time = 1012.0

real 0m2.335s
user 0m2.080s
sys 0m0.120s
Programa Carregado…

Ordenando…
Time = 1045.0

real 0m2.370s
user 0m2.180s
sys 0m0.080s
Programa Carregado…

Ordenando…
Time = 975.0

real 0m2.270s
user 0m2.060s
sys 0m0.070s
Programa Carregado…

Ordenando…
Time = 1730.0

real 0m3.070s
user 0m2.630s
sys 0m0.330s
Programa Carregado…

Ordenando…
Time = 957.0

real 0m2.320s
user 0m2.160s
sys 0m0.030s
[pleao@Hipolitta tmp]$ java -version
java version “1.5.0_02”
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0_02-b09)
Java HotSpot™ Client VM (build 1.5.0_02-b09, mixed mode, sharing)[

Reaquecendo o tópico:

http://kano.net/javabench/

:slight_smile:

é a velocidade hibersonica do tiger :smiley:

Olha soh…
Eu botei o seguinte codigo:

public class Teste{
 private static final int LOOP = 2000000000;
 public static void main(String args[]){
  X x;
  long ini,fim;
  ini=System.currentTimeMillis();
  for (int i = 0; i < LOOP; i++){
   x = new X();
  }
  fim=System.currentTimeMillis();
  System.out.println("Time: "+(float)( (float)(fim-ini)/1000.0f)+" s");
 }
}
class X{
 private int x;
 public X(){
  x = 0;
 }
}

java Teste
Time: 68.89 s

java -server Teste
Time: 61.265 s

Excelsior JET (Java native compiler) - (Gera código nativo!!!)
Teste.exe
Time: 1.031 s

8O 8O 8O 8O 8O 8O 8O

Fiquei de cara!!!

O o JET é evaluation (30 dias) mas gostei muito!!!
Eu compilei o SwingSet2 do jdk pra ver se tinha suporte a Swing e tudo… e ficou perfect!!!
SwingSet2.exe!!!
Achei sensacional pra quem quer desenpenho e nao precisa de portabilidade!
Não sei se existe o JET pra linux… mas pra linux tem o GCJ que também compila em native code, mas nao tem suporte a Swing… parece que o suporte é pra Java1.1 :frowning:

Mas acho legal vcs q tem linux na mão aí… tentarem algo aí!!!
Ele vem com o GCC.

É isso aí… alguem ja usou o JET por aí?!

mas compilando com o JET, o usuario vai precisar ter o jre instalado? (se nao me engano o JBuilder compila pra .exe, mas mesmo assim precisa do jre)

o arquivo fica com mais de 10MB?

Teoricamente não, mas ainda tenho q testar isso!!

What is required for a JET-compiled application to work: JRE, JET run-time DLLs?
The answer is complex:

  The run-time DLLs are not required if you are using the JetPerfect Global Optimizer plug-in (available only for the Professional Edition.)

  The JRE is not required if:
     1. You are using Excelsior JET, Professional Edition;
     2. Your application runs on J2SE 1.3 or 1.4; and
     3. Your application does not use any of the GUI-related Java 2 platform classes (AWT, Swing, JPEG, etc.) or the JDBC-ODBC bridge


Pois intaum… se vc usar Swing, AWT, JDBC… aí precisa da JRE.
Ele precisa das DLLs da JRE.
Mas ele não é como o gerador de EXE do JBuilder não, ele gera código nativo!!! Como se fosse C mesmo.
Mas é claro, precisa linkar alguns recursos da JRE se necessário.
So lembrando que na instalação de JET ele demorou uma hora e meia mais ou menos no meu AThlon 2800+ 512Mb , ele compila um monte de coisas!
É, não é o ideal, mas é legal conhecer essas coisas!!

Falow!

PS.:http://www.excelsior-usa.com/jetfaq.html

se com a Professional Edition o aplicativo alem de rodar sem a jre ele nao ficar enorme, ai sim eh interecante… pois dai eh possivel fornecer aos clientes o arquivo .jar portavel e para facilitar pro usuario fornesse o arquivo nativo tambem…

eu pesquisei na internet e parece que tem versao do JET pra linux tb!

[quote]Windows:

  1. Click on the link below to begin the download:

http://www.excelsior-usa.com/download/jet-370-eval-en-win32-90days.exe

  1. Launch the downloaded executable and follow the on-line prompts.

Linux:

  1. Click on the link below to begin the download:

http://www.excelsior-usa.com/download/jet-370-eval-en-linux-90days.bin[/quote]

Mas é trial… :sad:

Hohoho

que tesão hein!!!

Botei fé agora nos benchmarks feitos ai :wink:

very very cool!!!

Poderia aparecer um loko que manjasse horrores de C/C++ para esquentar mais isso ai né!!

quem sabe!!!

Divulguem por ai! :wink:

Cya!

que comédia.
mas cada um enxerga o que quer ver…