Press "Enter" to skip to content

Quantos objetos são criados em 1 segundo?

Navegando pelo blog do Ayende, encontrei um post curioso, onde ele fez um teste para saber quantos objetos em 1 segundo o .NET consegue criar. Nunca tinha pensado no assunto, e resolvi testar utilizando meu notebook, mas também comparar com outras linguagens, hoje posto a comparação entre .NET e Java.

São apenas curiosidades, não acredito que esses valores vão dizer que uma linguagem é melhor que outra, mas os resultados são curiosos.

Primeiro vamos as configurações de Hardware dos meus testes:

HP Pavilion dv4-1150br (uma droga de notebook)

  •  Core2Duo T5800 2Ghz
  • 3GB de memória DDR2
  • HD de 5400 RPM

E estou utilizando Windows 7 x64.

O código em C# é o mesmo utilizado pelo Ayende, só alterei a classe que será criada n vezes, e converti o código para Java, falando nisso qualquer absurdo escrito em Java por favor avisem, não é meu forte :).

Primeiro vamos as classes que serão criadas em C# e Java.

C#

[sourcecode language=”csharp”]
public class Album
{
public string Nome { get; set; }
public int NumeroDeMusicas { get; set; }
public DateTime DataDeLancamento { get; set; }
}
[/sourcecode]


Java

[sourcecode language=”java”]
public class Album{
private String _nome;
private int _numeroDeMusicas;
private Date _dataDeLancamento;

public String getNome(){
return _nome;
}

public void setNome(String nome){
_nome = nome;
}

public int getNumeroDeMusicas(){
return _numeroDeMusicas;
}

public void setNumeroDeMusicas(int numeroDeMusicas){
_numeroDeMusicas = numeroDeMusicas;
}

public Date getDataDeLancamento(){
return _dataDeLancamento;
}

public void setDataDeLancamento(Date dataDeLancamento){
_dataDeLancamento = dataDeLancamento;
}
}
[/sourcecode]

O código para testar é simples, durante 1 segundo n instâncias da classe Album serão criadas, códigos de teste.

C#

[sourcecode language=”csharp”]
class Program
{
static void Main(string[] args)
{
var cronometro = Stopwatch.StartNew();

var total = 0;

while (cronometro.ElapsedMilliseconds < 1000)
{
Album album = new Album();
total++;
}

cronometro.Stop();
Console.WriteLine(total);
}
}
[/sourcecode]

Java

[sourcecode language=”java”]
public class JavaTeste {

public static void main(String[] args) {
long time = System.currentTimeMillis();
long endTime = time + 1000;

int total = 0;

while(System.currentTimeMillis() < endTime){
Album album = new Album();
total++;
}

System.out.println(total);
}
}
[/sourcecode]

E os resultados…

C#: 629475
Java:  41518639

Resumindo, o Java criou o infinito e além mais objetos que o C#,  ahh então Java é mais rápido? Depende, foi só um teste de um cara curioso 🙂

Abaixo imagens dos testes.


Abraços.

Update 01

Confesso que fiquei impressionado com o resultado, e resolvi verificar o teste novamente, e valeu pela idéia também Alexandre Tarifa :), o vilão da história é o Stopwatch, modifiquei o teste em C# para não utilizar o Stopwatch, e sim o Enviromenti.TickCount.

Segue o código:

[sourcecode language=”csharp”]
static void Main(string[] args)
{
var final = Environment.TickCount + 1000;

var total = 0;

while (Environment.TickCount < final)
{
Album album = new Album();
total++;
}

Console.WriteLine(total);
}
[/sourcecode]

O resultados mudam para cada execução, na última ficaram assim, bem melhor:

C#: 40166858
Java:  42875611

Segue imagem do teste em C#:

Estou curioso para ver esse teste em outras linguagens, se a fadiga deixar faço mais testes :).

Abraços

  • Ramon E. Ritter

    Isso mostra a importância de um programador conhecer bem a linguagem de programação. Com uma pequena mudança feita por você no segundo teste o desempenho do C# aumentou 63,8 vezes.

    • Olá Ramon, confesso que fiquei impressionado com o primeiro teste :), ai fui lavar louça heuehue e fiquei pensando que tinha algo errado, não era possível uma diferença tão grande, e imaginei que o culpado poderia ser o Stopwatch, é a única coisa diferente nos dois testes, ai vi o Twitter do Tarifa falando também sobre a idéia de trocar o Stopwatch.

      Eu queria postar o mesmo que o Ayende, e tentar arrumar só depois, acho que ficou mais legal assim ver o problema e depois a solução.

      Obrigado pelo comentário.

      Abraços.

  • Pedro Júnior

    Legal o post, mesmo assim a diferença é grande 2708753, dependendo do que esta sendo processado, isso faz muita diferença no resultado final. Aprendizado de maquina é um bom exemplo.

  • Esse assunto me fez lembrar que um grande limitador de desempenho hoje em dia não é a alocação de objetos, mas a sua desalocação. Não adianta ter 64 GB de RAM no servidor se o garbage collector trava o serviço. Esse problema era um dos grandes gargalos do Twitter, e no mundo Java é contornado por usar ferramentas de gerenciamento de memória em linguagem C, como Terracota.