DÚVIDA desempenho de Threads ?Win7 x Ubuntu 11.04?

21 respostas
G

Pessoal,
estou fazendo um trabalho que compara a execução de um programa sequencial com um Multithread.
O código conta a quantidade de chaves iguais existentes em dois arrays, um com 2.000.000 números e outro com 20.000, o tempo gasto é cronometrado.
Obs: Os arrays são mantidos com a mesma base de números, ou seja independente do SO, da pesquisa ser Sequencial ou Multithread, os números estão sempre na mesma posição.
Programa Sequencial:

Thread.currentThread().setName("Thread Única");
    // faz a comparação de forma sequencial
               
                        System.out.println(Thread.currentThread().getName() + " Pesquisa iniciada no horario: " + getDateTime());
                                int cont = 0;
                                for (int j = 0; j < 20000;){
                                    for (int i = 0; i < 2000000; i++){
                                        if (vetor1[i] == vetor2[j]) {
                                            cont++;
                                        }
                                    }
                                    j = j + 1;
                                }
                        System.out.println(Thread.currentThread().getName() + " Pesquisa encerrada no horario: " + getDateTime() + "  Valor do contador atualizado: " + cont);

Programa"Multithread"( aproveitando que o processador é um Phenom-X3-Triple-Core):

private static AtomicInteger contador = new AtomicInteger(0);

     public void run(){
     // Com threads a carga de trabalho é dividida entre os 3 núcleos "qtde_nucleos = 3" 

            System.out.println(Thread.currentThread().getName()+" iniciada no horario: "+getDateTime());

                for(int j=inicio_thread;j<20000;)
                {
                        for(int i=0;i<2000000;i++)
                        {
                            if(vetor1[i] == vetor2[j])
                            {
                            contador.incrementAndGet();
                            }
                        }
                    j=j+qtde_nucleos; 
                }
            System.out.println(Thread.currentThread().getName()+" Encerrado no horario: "+ getDateTime()+" Valor do contador atualizado: "+contador);
      }


[u][color=red]Resultados:
[/color][/u]

[b]Windows 7
[/b]
Execução Sequencial: 2 minutos 23 segundos.
Execução com Threads: 51 segundos.

Ubuntu 11.04
Execução sequencial: 2 minutos 14 segundos.
Execução com Threads: 1 minuto 54 segundos.

No Win 7 o resultado foi o esperado, a execução do código multithread foi quase 3 vezes mais rápida que o código sequencial, enquanto no Ubuntu 11.04 a melhora de desempenho fica em torno de 15% somente, muito abaixo!
Então, porque no Win7 o desempenho foi tão superior?

Agradeço a qualquer ajuda!
E até mais ver!

21 Respostas

fabiozanardi

os 2 sistemas operacionais são de 64-bits?

J

as duas vms possuem a mesma versão?

J

Seria Jesus um X-man???

Zueiras a parte ( não resisti), outros processos rodando junto, I/O, rede, sei lá, tem muitas possibilidades, acredito que para fazer o teste vc deve ter deixado os sistemas com nada iniciado, para tentar ser o mais semelhante possível, apenas confirmando isso. Verifica se os dois S.O. são 32/64 bits, a versão da JVM ser idêntica, quantidade de ram usada.

G

Amigo, só o Win7 é 64 bits, o Ubuntu é 32.

Será por isso?

G

[size=16]

Agora sim, o Ubuntu é 32 bits - Versão da JVM 1.7.0_03

O Win7 é 64 bits e a JVM é a 1.7.0_02 [/size]

fabiozanardi

pode ser a versão de 64-bits do windows que está dando uma diferença no desempenho ou algum processo rodando no linux consumindo mais processamento, tente colocar a versao 1.7.02 no linux ver se nao pode ser algum bug na versão 1.7.03

G

Obrigado pelas dicas, vou aos testes e postarei aqui o resultado.

G

jaziel.rc:
Seria Jesus um X-man???

Zueiras a parte ( não resisti), outros processos rodando junto, I/O, rede, sei lá, tem muitas possibilidades, acredito que para fazer o teste vc deve ter deixado os sistemas com nada iniciado, para tentar ser o mais semelhante possível, apenas confirmando isso. Verifica se os dois S.O. são 32/64 bits, a versão da JVM ser idêntica, quantidade de ram usada.

Creio que o problema não seja relacionado aos programas que estão inicializando no boot do SO, pois o Win 7 inicializa antí-virus, msn, calendário, active desktop, barras entre outros, com tudo isso ele detém o melhor desempenho, já o Linux não tem praticamente nada inicializando. Vou fazer como vc’s disseram, tentarei trocar a JVM 1.7.0_02, se não resolver troco o Ubuntu para versão 64 bits e faço novo teste.

Aí posto aqui os resultados.

Obrigado!

fabiozanardi

Jóia, poste mesmo que estou utilizando aqui ubuntu 32-bit também, caso o problema seja a versão vou atualizar para 64-bit tb

abraço

G

ambos tem qto de RAM?

G

e é array de?

pra podermos testarmos aki tb.

J

GilsonNunes:
ambos tem qto de RAM?
Para fazer um benchmark adequado o teste precisava ser feito na mesma máquina. Mas como estudo pessoal dá para aceitar.

G

se der mais detalhes é possivel até montar um similar em pascal pra ver o desempenho da optimização da jvm, q segundo estou aprendendo, pode superar um codigo nativo.

J

pode superar somente se o programador for inexperiente. Se seguir todas as boas práticas o desempenho de um software nativo sempre estará a um passo afrente.

G

usando vetores de bytes nos tamanhos citados no inicio do tópico eu implementei em FPC e executou no win7 em 54 segundos.
no java executou o mesmo em 95 segundos.

é ± isso mesmo?

J

usando vetores de bytes nos tamanhos citados no inicio do tópico eu implementei em FPC e executou no win7 em 54 segundos.
no java executou o mesmo em 95 segundos.

é ± isso mesmo?

depende muito do algoritmo. O hotspot tem muitos otimizadores e gera código limpo também. A diferença é pequena pelo seguinte.

ops tipos seguros em java não vem sem um custo. É simplesmente uma questão de quantidade de código. O que acontece é que é difícil escrever um “bom” software sem ferramentas como hotspot, gc, e um jit que otimiza bem o resultado. Quando você escreve em pascal ou c++ o trabalho de escrever software com “boas práticas” é todo seu. Por isso você encontra software escrito em java mais rápido que um c++ ou pascal que seja. Mas isso porque com java é mais fácil.

Um “bom” software escrito em c++ responde muito, muito bem.

G

Sim,

Win7 e Ubuntu ambos com 4GB de RAM.

ViniGodoy

Por favor, evite escrever AJUDA, DÚVIDA, SOCORRO, URGENTE, com destaque no título do tópico.

ViniGodoy

Só a título de testes, experimente trocar o for interno pelo externo e refazer as medições.

G

OK,

G

Amanhã farei todos os testes sugeridos, já que vou poder testar outra JVM e até ter acesso ao ubuntu na versão 64 bits.
Postarei os resultados.

Obrigado!

Criado 28 de fevereiro de 2012
Ultima resposta 29 de fev. de 2012
Respostas 21
Participantes 6