Desempenho Java x C

[quote=“jeveaux”]Oi
Um exemplo, em aplicações com gerenciamento de memória muito complexo, usando JIT, Java não é só mais rápido do que C/C++, é increditavelmente mais rapido, é muito mais rápido.
T+[/quote]

Desculpem mas esse comentário parece um tanto fanático…

É visível que java esta se aproximando de C, mas dizer que ele já o igualou (em termos de velocidade) já eh um pouco de exagero, agora falar que é muito mais rápido é um pouco forçado…

Sugiro fazer testes com ambas as partes otimizadas. assim da pra ter uma ideia mais real de qual é a diferença entra eles

fiz mais alguns testes com o Quicksort, agora com as otimizacoes…

codigo Java:

public class Teste{
 private static final int SIZE = 1000000;
 public static void main(String args[]){
  int array[] = new int[SIZE];
  for (int i = 0; i < SIZE; i++){
   array[i] = i % 100;
  }
  quicksort(0, SIZE - 1, array);
 }
 public static void quicksort(int p, int q, int array[]){
  if (p < q){
   int j = p - 1;
   int aux = array[q];
   for (int i = p; i <= q; i++){
    if (array[i] <= aux){
     int taux = array[i];
     array[i] = array[++j];
     array[j] = taux;
    }
   }
   quicksort(p, j - 1, array);
   quicksort(j + 1, q, array);
  }
 }
}

codigo C:

#define SIZE 1000000
void quicksort(int p, int q, int array[]);
int main(){
 int array[SIZE], i;
 for (i = 0; i < SIZE; i++){
  array[i] = i % 100;
 }
 quicksort(0, SIZE - 1, array);
}
void quicksort(int p, int q, int array[]){
 int j, aux, i, taux;
 if (p < q){
  j = p - 1;
  aux = array[q];
  for (i = p; i <= q; i++){
   if (array[i] <= aux){
    taux = array[i];
    array[i] = array[++j];
    array[j] = taux;
   }
  }
  quicksort(p, j - 1, array);
  quicksort(j + 1, q, array);
 }
}

resultados Java SEM flag “-server”:
1 minuto, 4 segundos e 91 centesimos
1 minuto, 4 segundos e 80 centesimos
1 minuto, 4 segundos e 91 centesimos

resultados Java COM flag “-server”:
34 segundos e 55 centesimos
34 segundos e 53 centesimos
34 segundos e 53 centesimos

resultados C SEM flag “-O3”:
2 minutos, 4 segundos e 41 centesimos
2 minutos, 4 segundos e 41 centesimos
2 minutos, 4 segundos e 66 centesimos

resultados C COM flag “-O3”:
14 segundos e 80 centesimos
14 segundos e 78 centesimos
14 segundos e 78 centesimos

eu tinha feito testes passando a flag “-O” na compilacao do codigo java, mas nao teve nenhuma diferenca…

como eh possivel ver nos testes, com a otimizacao C fica mais rapido, mas nao esquecam que nenhum programa eh distribuido otimizado a um hardware especifico, daria muito trabalho ficar otimizando pra tudo qnto eh hardware, soh vai dar pra aproveitar a otimizacao do C se o programa for open source…

mesmo nao sendo mais rapido que C, o Tiger surpreendeu…

[quote=“sens”][quote=“jeveaux”]Oi
Um exemplo, em aplicações com gerenciamento de memória muito complexo, usando JIT, Java não é só mais rápido do que C/C++, é increditavelmente mais rapido, é muito mais rápido.
T+[/quote]

Desculpem mas esse comentário parece um tanto fanático…

É visível que java esta se aproximando de C, mas dizer que ele já o igualou (em termos de velocidade) já eh um pouco de exagero, agora falar que é muito mais rápido é um pouco forçado…

Sugiro fazer testes com ambas as partes otimizadas. assim da pra ter uma ideia mais real de qual é a diferença entra eles[/quote]

Oi…

Fanático??? 8O 8O

Eu não diria fanático, mas sim realista, basta fazer os testes… Fazer um contador ou um algoritmo de busca ou ordenaćão simples, não vai mostrar quem é mais rápido ou mais lento… Agora, com aplicaćões como eu citei, com gerenciamento de memória altamente complexo, o C não será mais do que Java, isso é fato e não fanatismo…

T+

[quote=“jeveaux”]
Oi…

Fanático??? 8O 8O

Eu não diria fanático, mas sim realista, basta fazer os testes… Fazer um contador ou um algoritmo de busca ou ordenaćão simples, não vai mostrar quem é mais rápido ou mais lento… Agora, com aplicaćões como eu citei, com gerenciamento de memória altamente complexo, o C não será mais do que Java, isso é fato e não fanatismo…

T+[/quote]

     A questão de gerenciamento de memória em C/C++, pode parecer inferior a java por que ela deixa muita coisa para o programador fazer, enquanto com java muita coisa a própria JVM faz, facilitando a vida do programador. Um programador experiênte em "C/C++" que sabe otimizar não apenas a compilação mas o código que escreve, concerteza faz aplicativos mais rapidos que em java. 
     Isso explica por que os aplicativos pesados que são programados para rodar em "cluster" e que levão dias para serem processados em sua maioria são escritos em "C".

   Não estou querendo defender C em relação a Java. Estou apenas mostrando meu ponto de vista que na VELOCIDADE ele é melhor, porem java tem inúmeras outras vantagens em relação a C .

jeveaux desculpe pelo fanático, certamente exagerei em minha colocação. Não foi minha intenção te ofender.

obs: ahm… o daniel_bocian pode não responder mais nesse tópico por um tempo pq entrou de férias haeheahe :lol: (ele é meu colega de trabalho)

bom na verdade realmente o java não pode ser mais rapido do q o C, pois o C esta em camadas mais inferiores q o java contando da linguagem de maquina ate a de alto nivel. acho q o interressante aqui é q o java não é tao lento quanto dizem e esta cada vez ficando melhor. no caso do codigo q esta o testando ai quando o java usa mais variaveis ele gasta muito mais tempo q o C, usando ate duas variaveis o C fica mais lento depois usando mais ele gasta menos tempo q o java. ate pelo caso de o java de a gerencia de memoria mais organizada como o garbage etc…

Bom, nao sei como conseguiram estes resultados, porem, reproduzi eles e os resultados nao batem com os encontrados aqui :grin:

adriano@gpserver01:~/sources/testes$ for prog in *.c; do gcc $prog -o ${prog%%.c}; done
adriano@gpserver01:~/sources/testes$ time ./bubble ; time ./quicksort ; time ./Teste

real 0m33.292s
user 0m30.242s
sys 0m0.031s

real 1m52.445s
user 1m18.586s
sys 0m0.139s

real 0m7.070s
user 0m6.821s
sys 0m0.002s

adriano@gpserver01:~/sources/testes$ for prog in *.java; do javac $prog; done
adriano@gpserver01:~/sources/testes$ time java Bubble; time java Quicksort; time java Teste

real 0m46.350s
user 0m33.429s
sys 0m0.223s

real 1m44.692s
user 0m50.278s
sys 0m0.643s

real 0m8.230s
user 0m7.134s
sys 0m0.026s

Somente no resultado do quicksort ocorreu uma vantagem do Java, no resto nao. A razao para isto ocorrer eh que a JVM provavelmente utiliza algum mecanismo de pre-fetching/caching, com isto acelerando os enlaces.

Quanto a discussao long vs. int, long e int tem o mesmo tamanho de palavra, 32 bits, int tem 16 bits em compiladores 16 bits.

Outra coisa soh para ser chato :twisted: , Java nao eh 100% orientada a objeto, existem tipos primitivos.

E finalmente, um programa em C geralmente serah mais rapido do que um em Java, o que pode ocorrer eh o compilador Java se utilizar de tecnicas de shortcut e como disse acima, pre-fetching/caching.
A razao para C gerar programas mais rapidos eh simples, a altura que se encontra da base do kernel e sua visao simplificada de tudo.

Falow!

[b] é por isso q existe as classes invólucras(Integer, Double…) com isso vc consegue 100% sacou!

a dados sao reais sim testamos aqui com o time do linux nao tem como errar :lol: [/b]

vc usou o tiger (jdk5.0)? o tiger ta BEM mais rapido que o 1.4…

c é mais rapido que java???

ok, vamos ver então como fica a programação concorrente!

vc usou o tiger (jdk5.0)? o tiger ta BEM mais rapido que o 1.4…[/quote]

o felipe fizemos o teste aqui no 1.4 e JAVA FOI MAIS RÁPIDO, nem usamos o tiger q é mais rapido. mas de acordo com e q eu escrevi no topico ai de cima sobre o numero de variaveis.

[quote=“Ejunior”][quote=“tanob”]
Outra coisa soh para ser chato :twisted: , Java nao eh 100% orientada a objeto, existem tipos primitivos.
[/quote]
[b] é por isso q existe as classes invólucras(Integer, Double…) com isso vc consegue 100% sacou!

a dados sao reais sim testamos aqui com o time do linux nao tem como errar :lol: [/b][/quote]

[risos] Se tem tipos primitivos nao eh 100% OO :wink:
Por exemplo, como fazes para saber se um Integer eh maior que outro Integer? usa o metodo intValue() ? …

Quanto a versao da JVM eh o java 1.5 ou 5 ou tiger :slight_smile:

Seja processamento paralelo, distribuido, etc. C sempre gerarah um codigo mais rapido.
Mas seja como queiram, continuem acreditando no que lhes convem, eu prefiro ser realista e ter nocao de que nada eh perfeito :cool:

Falow!

[quote=“tanob”][quote=“Ejunior”][quote=“tanob”]
Outra coisa soh para ser chato :twisted: , Java nao eh 100% orientada a objeto, existem tipos primitivos.
[/quote]
[b] é por isso q existe as classes invólucras(Integer, Double…) com isso vc consegue 100% sacou!

a dados sao reais sim testamos aqui com o time do linux nao tem como errar :lol: [/b][/quote]

[risos] Se tem tipos primitivos nao eh 100% OO :wink:
Por exemplo, como fazes para saber se um Integer eh maior que outro Integer? usa o metodo intValue() ? …

Quanto a versao da JVM eh o java 1.5 ou 5 ou tiger :slight_smile:

Seja processamento paralelo, distribuido, etc. C sempre gerarah um codigo mais rapido.
Mas seja como queiram, continuem acreditando no que lhes convem, eu prefiro ser realista e ter nocao de que nada eh perfeito :cool:

Falow![/quote]

como jah disse, eu nao to dizendo que java eh mais rapido que C, nao eh com um teste simples como esse que vou poder afirmar algo do tipo, o que ocorreu foi que nos testes que eu fiz o java foi mais rapido (com o C nao otimizado)…

acho que ficou bem claro que java nao tao lento quanto dizem por ai… mas pra dizer que eh mais rapido que C teria que ser feito um teste mais preciso, e testando cada aspecto separadamente, ai sim teriamos uma nocao de qual linguagem eh mais rapida e em quais aspectos…

[quote=“tanob”]Seja processamento paralelo, distribuido, etc. C sempre gerarah um codigo mais rapido.
Mas seja como queiram, continuem acreditando no que lhes convem, eu prefiro ser realista e ter nocao de que nada eh perfeito :cool: [/quote]

ai vc jah ta sendo um pouco radical, como vc mesmo disse, nada eh perfeito, C nao eh perfeito, e em alguns casos java pode ser mais rapido que C, como nos testes que eu fiz e java foi mais rapido…

[quote=“Felipe”]
como jah disse, eu nao to dizendo que java eh mais rapido que C, nao eh com um teste simples como esse que vou poder afirmar algo do tipo, o que ocorreu foi que nos testes que eu fiz o java foi mais rapido (com o C nao otimizado)…

acho que ficou bem claro que java nao tao lento quanto dizem por ai… mas pra dizer que eh mais rapido que C teria que ser feito um teste mais preciso, e testando cada aspecto separadamente, ai sim teriamos uma nocao de qual linguagem eh mais rapida e em quais aspectos…

[quote=“tanob”]Seja processamento paralelo, distribuido, etc. C sempre gerarah um codigo mais rapido.
Mas seja como queiram, continuem acreditando no que lhes convem, eu prefiro ser realista e ter nocao de que nada eh perfeito :cool: [/quote]

ai vc jah ta sendo um pouco radical, como vc mesmo disse, nada eh perfeito, C nao eh perfeito, e em alguns casos java pode ser mais rapido que C, como nos testes que eu fiz e java foi mais rapido…[/quote]

Olha eu compilei o codigo C sem otimizacao alguma :cool:
e ele foi mais rapido. Voce jah executou o codigo Java com o parametro ‘-verbose’? Eh, entao faca…

Bom, como isso jah estah virando um flamewar entre linguagens e eu nao acredito muito nisso, visto que cada linguagem tem seu proposito, vou deixar ai que continuem iludidos :lol:

Soh para constar:

adriano@gpserver01:~$ gcc -v
Reading specs from /usr/lib/gcc/i486-linux/3.4.4/specs
Configured with: …/src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --libexecdir=/usr/lib --with-gxx-include-dir=/usr/include/c++/3.4 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --program-suffix=-3.4 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk --disable-werror i486-linux
Thread model: posix
gcc version 3.4.4 20041218 (prerelease) (Debian 3.4.3-7)

adriano@gpserver01:~$ java -version
java version “1.5.0”
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
Java HotSpot™ Client VM (build 1.5.0-b64, mixed mode, sharing)

[quote=“tanob”][quote=“Felipe”]
como jah disse, eu nao to dizendo que java eh mais rapido que C, nao eh com um teste simples como esse que vou poder afirmar algo do tipo, o que ocorreu foi que nos testes que eu fiz o java foi mais rapido (com o C nao otimizado)…

acho que ficou bem claro que java nao tao lento quanto dizem por ai… mas pra dizer que eh mais rapido que C teria que ser feito um teste mais preciso, e testando cada aspecto separadamente, ai sim teriamos uma nocao de qual linguagem eh mais rapida e em quais aspectos…

[quote=“tanob”]Seja processamento paralelo, distribuido, etc. C sempre gerarah um codigo mais rapido.
Mas seja como queiram, continuem acreditando no que lhes convem, eu prefiro ser realista e ter nocao de que nada eh perfeito :cool: [/quote]

ai vc jah ta sendo um pouco radical, como vc mesmo disse, nada eh perfeito, C nao eh perfeito, e em alguns casos java pode ser mais rapido que C, como nos testes que eu fiz e java foi mais rapido…[/quote]

Olha eu compilei o codigo C sem otimizacao alguma :cool:
e ele foi mais rapido. Voce jah executou o codigo Java com o parametro ‘-verbose’? Eh, entao faca…

Bom, como isso jah estah virando um flamewar entre linguagens e eu nao acredito muito nisso, visto que cada linguagem tem seu proposito, vou deixar ai que continuem iludidos :lol:

Soh para constar:

adriano@gpserver01:~$ gcc -v
Reading specs from /usr/lib/gcc/i486-linux/3.4.4/specs
Configured with: …/src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --libexecdir=/usr/lib --with-gxx-include-dir=/usr/include/c++/3.4 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --program-suffix=-3.4 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk --disable-werror i486-linux
Thread model: posix
gcc version 3.4.4 20041218 (prerelease) (Debian 3.4.3-7)

adriano@gpserver01:~$ java -version
java version “1.5.0”
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
Java HotSpot™ Client VM (build 1.5.0-b64, mixed mode, sharing)[/quote]

CARA SE NAO DA DANDO O RESULTADO Q DEU AQUI É PQ VC AINDA NAO APRENDEU A COMPILA!!

OS TESTES Q FIZERAM TESTAMOS AQUI NA EMPRESA, OS CARA Q TESTARAM AQUI SAO PROGRAMADORES E ESPECIALISTAS EM C ELES NEM SACAM JAVA.

É SOBRE A OO VC PRECISA REVER OS SEUS CONCEITOS!!

ok, então seja feliz usando C :razz:

[quote=“Ejunior”]
CARA SE NAO DA DANDO O RESULTADO Q DEU AQUI É PQ VC AINDA NAO APRENDEU A COMPILA!![/quote]

[risos] Eu apresentei provas.

[quote=“Ejunior”]
OS TESTES Q FIZERAM TESTAMOS AQUI NA EMPRESA, OS CARA Q TESTARAM AQUI SAO PROGRAMADORES E ESPECIALISTAS EM C ELES NEM SACAM JAVA. [/quote]

Rapaz, eu nao estou sendo porta-voz de programador C como voce, eu sou antes de programador Java programador C :lol:

Mas isto nao importa, o que nao pode ocorrer eh o gosto da linguagem subir a cabeca e ignorar os fatos. C tem seus problemas, mas nao com performance.

[quote=“Ejunior”]
É SOBRE A OO VC PRECISA REVER OS SEUS CONCEITOS!![/quote]

Olha, acho que vc nao pensou antes de escrever. A meu ver sua critica eh infundada. Me aponte algum lugar na discussao onde apresento alguma ideia equivocada quanto ao paradigma de OO.

E quanto aos resultados, ateh agora eu soh vi resultados cronometrados duvidosamente, mandem resultados baseados em tempo medido pelo sistema operacional e nao com base na mao de voces :smiley:

[quote=“Ejunior”][quote=“tanob”][quote=“Felipe”]
como jah disse, eu nao to dizendo que java eh mais rapido que C, nao eh com um teste simples como esse que vou poder afirmar algo do tipo, o que ocorreu foi que nos testes que eu fiz o java foi mais rapido (com o C nao otimizado)…

acho que ficou bem claro que java nao tao lento quanto dizem por ai… mas pra dizer que eh mais rapido que C teria que ser feito um teste mais preciso, e testando cada aspecto separadamente, ai sim teriamos uma nocao de qual linguagem eh mais rapida e em quais aspectos…

[quote=“tanob”]Seja processamento paralelo, distribuido, etc. C sempre gerarah um codigo mais rapido.
Mas seja como queiram, continuem acreditando no que lhes convem, eu prefiro ser realista e ter nocao de que nada eh perfeito :cool: [/quote]

ai vc jah ta sendo um pouco radical, como vc mesmo disse, nada eh perfeito, C nao eh perfeito, e em alguns casos java pode ser mais rapido que C, como nos testes que eu fiz e java foi mais rapido…[/quote]

Olha eu compilei o codigo C sem otimizacao alguma :cool:
e ele foi mais rapido. Voce jah executou o codigo Java com o parametro ‘-verbose’? Eh, entao faca…

Bom, como isso jah estah virando um flamewar entre linguagens e eu nao acredito muito nisso, visto que cada linguagem tem seu proposito, vou deixar ai que continuem iludidos :lol:

Soh para constar:

adriano@gpserver01:~$ gcc -v
Reading specs from /usr/lib/gcc/i486-linux/3.4.4/specs
Configured with: …/src/configure -v --enable-languages=c,c++,java,f77,pascal,objc,ada,treelang --prefix=/usr --libexecdir=/usr/lib --with-gxx-include-dir=/usr/include/c++/3.4 --enable-shared --with-system-zlib --enable-nls --without-included-gettext --program-suffix=-3.4 --enable-__cxa_atexit --enable-libstdcxx-allocator=mt --enable-clocale=gnu --enable-libstdcxx-debug --enable-java-gc=boehm --enable-java-awt=gtk --disable-werror i486-linux
Thread model: posix
gcc version 3.4.4 20041218 (prerelease) (Debian 3.4.3-7)

adriano@gpserver01:~$ java -version
java version “1.5.0”
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0-b64)
Java HotSpot™ Client VM (build 1.5.0-b64, mixed mode, sharing)[/quote]

CARA SE NAO DA DANDO O RESULTADO Q DEU AQUI É PQ VC AINDA NAO APRENDEU A COMPILA!!

OS TESTES Q FIZERAM TESTAMOS AQUI NA EMPRESA, OS CARA Q TESTARAM AQUI SAO PROGRAMADORES E ESPECIALISTAS EM C ELES NEM SACAM JAVA.

É SOBRE A OO VC PRECISA REVER OS SEUS CONCEITOS!!
[/quote]

Pq tu não manda os resultados obtidos pelo time ou usr/bin/time? Como tu testou os resultados?

Sou programador java, gosto de java, mas daí a java ser uma paixão que defendo mesmo que não haja provas vai uma longa distância.
O único jeito de java ser mais rápido que C ou C++ é por algum recurso de chache ou outro tipo de otimização da JVM. Isto implica de certa forma em uma alteração no algoritmo.

Com relação a java ser orientado a objeto… com certeza não é totalmente. Se o tanob tem que rever conceitor outros tem que aprender estes conceitos, pois os livros de orientação a objeto não fazem referencias a Java, mas sim a Smalltalk como exemplo de linguagem totalmente orienteda a objetos. Java não implementa herança múltipla de classes, nem tampouco sobrecarga de operadores. Se C++ que implementa tudo isto não é considerado totalmente orientado a objetos porque sempre comessa por uma função (main) então java com tipo primitivo tb não pode ser considerado totalmente orientado a objetos.

Falando de problemas de compilação pq não manda a sua linha de comando? É assim, trocando conhecimentos que melhoramos, não com gritos (A não ser que tenha estragado seu CAPSLOCK, ai desculpe).

Programação concorrente realmente java é muito bom, principalmente para o corporativo, mas nos supercomputadores não se usa Java, usa?

T+

Rafael

no resultado do quicksort, C levou 1 minuto a mais que Java, cronometrando pode ateh nao ser preciso, pode ateh variar alguns centesimos, talvez ateh 1 segundo, 2 tb eh possivel, mas dai jah eh dificil… mas agora pra ver uma diferenca de 1 minuto, nao precisa nem de relogio :grin:

eu tinha feito isso no relogio pq eu nao conhecia o comando time do linux…

mas como vc faz questao de ver o resultado baseado em tempo medido pelo sistema:

Ae jah perdeu a graça essa discussão aqui…
Levar as parada pro lado pessoal não da certo…
Tava legal ler o topic até o Tanob entrar no meio… ae ferrou tudo…

Mas firmeza…