Qual é a maneira mais rápida de retornar uma lista de objetos em C#?
-
20-09-2019 - |
Pergunta
Estou escrevendo um plug-in para um programa de modelagem 3D. Existe um recurso AA da API em que você pode interceptar o pipeline de exibição e inserir geometria adicional que será exibida sem realmente estar no modelo (você pode vê -lo, mas não pode selecionar/mover/excluir etc. etc.) .
Parte desse recurso da API é um método que é chamado em cada atualização de tela usada para informar ao programa qual geometria extra ser exibida. Agora eu tenho um Hashset Isso é iterado com uma declaração foreach. OnBrep é a classe de geometria genérica da API.
Eu tenho um comando adicional que despejará a geometria "fantasma" no modelo real. Descobri que, se a geometria estiver realmente no modelo, a tela acelera muito. Então, estou me perguntando se existe uma maneira mais rápida de fornecer a lista de objetos para o programa? Uma simples matriz unidimensional seria significativamente mais rápida que um hashset <>?
Solução
A maneira mais rápida de retornar uma coleção de objetos é retornar (a) o tipo físico real usado internamente para construir a coleção ou (b) um tipo que pode ser lançado de tal maneira que os dados não sejam copiados em memória. Assim que você começa a copiar dados (por exemplo CopyTo
, ToArray
, ToList
, um construtor de cópias, etc.) Você perdeu tempo.
Dito isto, a menos que o número de itens seja grande, isso será uma micro-otimização e, portanto, provavelmente não vale a pena fazer. Nesse caso, basta retornar o tipo de coleção que seria mais útil para o código de chamada. Se você é desconfortável, faça alguns testes de tempo em vez de adivinhar.
Outras dicas
Isso aqui é um extenso estudo sobre o desempenho da lista de hashset/dicionário/genérico
Mas é sobre pesquisas importantes
Personnaly, acho que uma lista normal ou genérica é mais rápida para uma operação para e cada uma vez que não envolve itens indexados/despesas gerais (a inserção do ESP etc. deve ser mais rápida) ... mas isso é apenas um sentimento.
Geralmente, ao trabalhar com gráficos 3D, você obtém o melhor desempenho se conseguir reduzir as chamadas de desenho/alterações de estado o máximo possível.
No seu caso, eu tentaria reduzir as chamadas de desenho ao mínimo, mesclando sua geometria adornada ou tentando usar algum tipo de recurso em lote, se estiver disponível.
É muito provável que a queda do quadro não seja por causa do uso de uma lista/dicionário de hash em vez de uma matriz. (A menos que haja uma função de hash quebrada/cara em algum lugar ...).