fundo
Recentemente, estou no processo de duradouras entrevistas técnicas cansativas para posições que usam a pilha .NET, algumas das quais incluem perguntas tolas como essa e algumas que são mais válidas. Recentemente, deparei com um problema que pode ser válido, mas quero verificar com a comunidade aqui para ter certeza.
Quando perguntado por um entrevistador como eu contaria a frequência das palavras em um documento de texto e classificaria os resultados, respondi que
- Use um objeto de fluxo e coloque o arquivo de texto na memória como uma sequência.
- Divida a string em uma matriz nos espaços, ignorando a pontuação.
- Use LINQ contra a matriz para
.GroupBy()
e.Count()
, em seguida,OrderBy()
disse contagem.
Entendi errado esta resposta por dois motivos:
- A transmissão de um arquivo de texto inteiro na memória pode ser desastrosa. E se fosse uma enciclopédia inteira? Em vez disso, devo transmitir um bloco de cada vez e começar a construir uma tabela de hash.
- O LINQ é muito caro e requer muitos ciclos de processamento. Em vez disso, eu deveria ter criado uma tabela de hash e, para cada iteração, apenas adicionaria uma palavra à tabela de hash se ela não existisse e aumentaria sua contagem.
A primeira razão parece, bem, razoável. Mas o segundo me dá mais pausa. Eu pensei que um dos pontos de venda do LINQ é que ele simplesmente abstrai operações de nível inferior como tabelas de hash, mas que, sob o véu, ainda é a mesma implementação.
Questão
Além de alguns ciclos de processamento adicionais para chamar métodos abstraídos, o LINQ requer significativamente mais ciclos de processamento para realizar uma tarefa de iteração de dados do que uma tarefa de nível inferior (como construir uma tabela de hash) exigiria?