+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
  1. RheaIoi8215

    5 Pontos

  2. RositaLansel

    5 Pontos

  3. MilesWeston

    5 Pontos

  4. RoseannViera

    5 Pontos

  5. DianaNickel

    5 Pontos

  6. KandiGower0

    5 Pontos

200 pontos
Melhores 2025 Aug 18 - 24
  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
710 usuários