Pergunta

Em um projeto que estou trabalhando, não são realmente enormes conjuntos (elementos 1M-1B), e as coisas são modificadas como coleções principalmente.

É um aplicativo em tempo real, e por isso o desempenho é fundamental.

Para algumas operações, como reverso, BinarySearch (possível?), Etc vai sofrer mais do que outros, como Select, etc.

É viável para implementar o próprio IEnumerable com possível MoveNext, MovePrev, etc e possuem extensões LINQ implementadas que levam vantagens destes?

Se isso vai acontecer, vai acontecer no final do projeto. Porque precisamos fazê-lo funcionar em primeiro lugar, em seguida, torná-lo mais rápido.

Todos em tudo isso não deve ser muito trabalho, certo?

Foi útil?

Solução

É muito definitivamente possível criar sua própria implementação de Enumerable que poderia especial caso algumas situações. Você seria basicamente deseja detectar seus próprios tipos de coleção (ou possivelmente apenas coleções como List<T>) e usar uma implementação mais eficiente se for o caso.

Eu tenho um amostra projeto que eu usei para demo "implementação de LINQ to Objects em uma hora "que você pôde gostar de olhar para exemplos. Não é uma implementação completa e, em particular, da menos eficiente do que o LINQ real para objetos -., Mas você ainda pode achar que é interessante

Como alternativa, você pode achar que i4o (indexado LINQ) faz tudo que você precisa para fora da caixa - ou que você seria melhor contribuindo para isso do que começar do zero. Vale a pena conferir.

Basta lembrar que no final do dia, LINQ é basicamente um design agradável juntamente com açúcar sintático. O compilador C # não sabe qualquer especial sobre System.Linq.Enumerable, por exemplo.

Outras dicas

Se você realmente quer desempenho, você pode fazer muito. Lembre-se que a seguinte seleção:

var result = from element in collection
             where element.Id == id
             select element;

Compila como:

var result = collection.Where(element => element.Id == id);

Se você criar o método a seguir para o tipo de collection, então você pode explorar o fato de que a ação principal é a igualdade dos Estados-Id e lidar com o pedido de forma otimizada. O importante é identificar corretamente as operações de desempenho crítico em sua coleção e escolher os algoritmos corretos (complexidade ou seja) para realizá-las.

public IEnumerable<TElement> Where(Expression<Func<TElement, bool>> selector)
{
    // detect equality of the Id member and return some special value
}

Considere System.Linq.Enumerable.Reverse (.) - este método enumera plenamente o IEnumerable antes de retornar o primeiro resultado

Se a consulta é myCollection.Reverse (). Tome (10), e sua coleção tem bilhões de itens, é uma idéia horrível para enumerar os milhares de milhões de itens para obter 10.

Se você forneceu um método reverso em seu próprio tipo, você poderia fornecer uma implementação melhor que simplesmente laços para trás sobre a coleção (pelo índice possivelmente).

A chave para isso está fornecendo o seu próprio tipo onde você controla as implementações. Você não pode usar as implementações que trabalho para todos IEnumerable<T> porque essas implementações não vai tirar o máximo partido das capacidades do seu tipo de coleção personalizada.

É viável para implementar o próprio IEnumerable com possível MoveNext, MovePrev, etc e LINQ implementado própria extensões que tiram vantagens de esses?

IEnumerable (ou mais propriamente, IEnumerator) não tem MovePrev. Você pode definir uma interface:

public interface IReversable<T> : IEnumerable<T>
{
    IEnumerator<T> GetReverseEnumerator();
}

Esta poderia ser implementado por qualquer recipiente que suporta eficientemente a enumeração inversa.

Você pode então escrever uma sobrecarga de Reverse (o método de extensão) para o trabalho fora desta nova interface, e classes de coleção que implementam a interface, etc. E então você teria que usar essas classes de coleção em vez dos normais como List<T> .

Mas (não tenho refletor útil para verificar), pode ser que o suficiente inteligente built-in Reverse é fazer as coisas da maneira rápida se ele pode obter a interface IList da coleção, que seria otimizar a mais comum casos muito bem de qualquer maneira.

Assim, não pode haver um monte de ponto neste tipo de abordagem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top