+5 votos
107 visitas
Das três opções informadas, qual é mais performatica? Ou seja, executará mais rápido?
por (368 pontos) | 107 visitas

1 Resposta

+5 votos
Melhor resposta

A performance, ou tempo de execução, de um programa/algoritmo é estabelecida pela quantidade de instruções que o processador tem que executar.

No nosso caso:

*TDContainer.Locate
O locate percorre os registros comparando um campo com um valor, ou seja:
1 looping com 1 comparação.

*TDContainer.LocateWhere
O LocateWhere percorre os registros verificando se a condição é verdadeira, ou seja:
1 looping com 1 parse de expressão(quanto maior a expressão mais complexo o parse) e 1 verificação se a expressão é valida.

*Linq
O Linq percorre os itens da lista verificando se a expressão lambda é verdadeira, ou seja:
1 looping com 1 chamada de função.

Analisando assim aparentemente os 3 não teriam muita variação de performance, porém, devemos observar os seguintes pontos:

a) O Linq é compilado, logo ele roda em linguagem nativa, com certeza mais rápido que os outros.
b) O Locate faz a comparação de um campo apenas, então o tempo seria de obter o valor do campo no registro.
c) O LocateWhere tem um alto custo para quebrar a expressão informada, com certeza lento.

Então nossa classificação ficou:
1) Linq
2) Locate
3) LocateWhere

Pergunta: Então nunca devo utilizar LocateWhere do TDContainer?
Resposta: 
O TDContainer.LocateWhere deve ser utilizado apenas quando você não sabe da condição.
Por exemplo a condição é informada por um usuário do sistema e fica no banco de dados.
Se você sabe a condição, mas, precisa validar mais de um campo é recomendável 
concatenar a chave em um único campo e fazer um Locate por este campo.

Uma informação interessante é que o Locate faz um hash do campo quando o container tem mais de 100 registros, isso deixa ele muito rápido.

por (368 pontos)
editado por
LocateWhere is deprecated

Perguntas relacionadas

Melhores Aug 2025
    200 pontos
    Melhores 2025 Jul 28 - Aug 03
    1. Larson

      156 Pontos

    2. danilo.pereira

      96 Pontos

    3. danilo.pereira

      96 Pontos

    4. danilo.pereira

      96 Pontos

    5. luciano.fronza

      61 Pontos

    6. luciano.fronza

      61 Pontos

    7. luciano.fronza

      61 Pontos

    8. diuari.molinari

      52 Pontos

    9. diuari.molinari

      51 Pontos

    10. diuari.molinari

      51 Pontos

    517 perguntas
    566 respostas
    389 comentários
    704 usuários