none
Linq tem fraca performance? RRS feed

  • Pergunta

  • Pessoal, desenvolvi uma pequena rotina para fazer uma busca recursiva. Pra ficar simples de entender, precisava contar o número de membros de uma família (Avô tem 3 filhos, cada filho tem mais 2 filhos, 1 desses tem 2, outro 3 e assim por diante).

    Antigamente, partiria pra um ForEach (ou for i) e resolveria meu problema fácil, com umas 6 linhas de código. Assim por exemplo:

     

    internal int ContarTodosOsFilhosSemLin()
    {
       int result = Membros.Count;
       foreach (Class classe in Dependentes)
       {
         result = result + classe.ContarTodosOsFilhosSemLin();
       }
       return result;
     }

     

    Massss, como gosto de fazer parte das novidades, tentei com linq. Não sei se esta da melhor forma, mas ficou assim:

     

    internal int ContarTodosOsFilhos()
        {
          return Membros.Count + (from dependente in Dependentes
                      select dependente.ContarTodosOsFilhos()).Sum();
        }

     

    A princípio OK, retornou o mesmo resultado, está correto, que legal! Economizei algumas linhas de código e fiz em um código bunito! Legal.
    Do nada pensei "quanto será a diferença de tempo". Rodei ambos os métodos com stopwatch na mesma iteração (1000000) e pro meu susto, o tempo foi o dobro quando utilizo linq.

    Pra mim não há dúvidas, uso o dobro do fonte mas não gasto o dobro do tempo.

    Ta certo que não rodarei o método 1000000x de uma única vez, mas se o linq é realmente o dobro do tempo, ter ele em todo o fonte para consultas reduz a performance e não sou a favor disso.

    Peço por favor que me ajudem, se o fonte estiver escrito da forma errada, ou para tirar a dúvida em relação a performance.

    Fico grato pela atenção de todos.

    att

    Leandro Fagundes


    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    terça-feira, 22 de junho de 2010 12:44

Respostas

  • Hi,

    E nao tinha entendido que tudo estava dentro da classe Dependentes.

    Bom, parece que e isso mesmo, o linq demora mas que o foreach, pelo menos nesse caso.

    tambem, levando em consideracao que o foreach trabalha com base em IEnumerable e que o linq  usa um monte do codigo dentro dele para rodar, o resultado com consultas simples nao me espanta.

    agora quando se trata de consultas complexas como um linqtosql nao da pra dizer que o linq tem baixa performance, mesmo sabendo que uma consulta linqtosql, mesmo simples gera bem mais codigo tsql que o necessario, ainda acho mais proveitoso, salvas excessões.

    Att,


    </tb
    Adriel Codeco Silva Email : adriel.silva@uppercase.com.br MSN: adrielcodeco@hotmail.com Blog: adrielcodeco.wordpress.com Uppercase – www.uppercase.com.br R. Primeiro de Março, 661 – Centro Barra Bonita - SP - CEP 17340-000
    sexta-feira, 25 de junho de 2010 20:17
    Moderador

Todas as Respostas

  • Hi,

    O que tem dentro do metodo .ContarTodosOsFilhos() ? pode ser esse metodo a causa do peso na performance.

    Att,


    Adriel Codeco Silva Microsoft Partner http://adrielcodeco.wordpress.com www.uppercase.com.br adrielcodeco@hotmail.com
    sexta-feira, 25 de junho de 2010 01:17
    Moderador
  • internal int ContarTodosOsFilhos()
      {
       return Membros.Count + (from dependente in Dependentes
             select dependente.ContarTodosOsFilhos()).Sum();
      }
    
    O método é recursivo! Ele entra dentro dele próprio, garantindo que todos os membros de todos os dependentes dos dependentes serão contados!
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand" (Martin Fowler)
    sexta-feira, 25 de junho de 2010 12:27
  • Hi,

    E nao tinha entendido que tudo estava dentro da classe Dependentes.

    Bom, parece que e isso mesmo, o linq demora mas que o foreach, pelo menos nesse caso.

    tambem, levando em consideracao que o foreach trabalha com base em IEnumerable e que o linq  usa um monte do codigo dentro dele para rodar, o resultado com consultas simples nao me espanta.

    agora quando se trata de consultas complexas como um linqtosql nao da pra dizer que o linq tem baixa performance, mesmo sabendo que uma consulta linqtosql, mesmo simples gera bem mais codigo tsql que o necessario, ainda acho mais proveitoso, salvas excessões.

    Att,


    </tb
    Adriel Codeco Silva Email : adriel.silva@uppercase.com.br MSN: adrielcodeco@hotmail.com Blog: adrielcodeco.wordpress.com Uppercase – www.uppercase.com.br R. Primeiro de Março, 661 – Centro Barra Bonita - SP - CEP 17340-000
    sexta-feira, 25 de junho de 2010 20:17
    Moderador