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.