Qual é a maneira mais rápida de ler um arquivo de texto em uma variável de string?
Entendo que isso pode ser feito de várias maneiras, como ler bytes individuais e depois convertê-los em string. Eu estava procurando por um método com codificação mínima.
Respostas:
Que tal
File.ReadAllText
:fonte
StreamReader.ReadToEnd
é mais eficiente.StreamReader.ReadToEnd
é mais eficiente queReadAllLines
. O que é de se esperar, pois o último também divide o texto em linhas. Mas estamos falando de um método diferenteReadAllText
,. Na verdade, a resposta que você menciona mostra queReadAllText
apenas ligaStreamReader.ReadToEnd
internamente.Uma comparação de referência de manipulação de arquivos
File.ReadAllLines
vs aStreamReader ReadLine
partir de C #Abordagem StreamReader
Como a
File.ReadAllText
abordagem foi sugerida por outras pessoas, você também pode tentar mais rapidamente (não testei quantitativamente o impacto no desempenho, mas parece ser mais rápido do queFile.ReadAllText
(veja a comparação abaixo)). A diferença no desempenho será visível apenas no caso de arquivos maiores.Comparação de File.Readxxx () vs StreamReader.Readxxx ()
Visualizando o código indicativo através ILSpy eu encontrei o seguinte sobre
File.ReadAllLines
,File.ReadAllText
.File.ReadAllText
- UsaStreamReader.ReadToEnd
internamenteFile.ReadAllLines
- Também usaStreamReader.ReadLine
internamente com a sobrecarga adicional de criar oList<string>
retorno como linhas de leitura e loop até o final do arquivo.Portanto, ambos os métodos são uma camada adicional de conveniência construída sobre ela
StreamReader
. Isso é evidente pelo corpo indicativo do método.File.ReadAllText()
implementação descompilada pelo ILSpyfonte
File.ReadAllText
também?File.ReadAllText()
é simplesmente um invólucroStreamReader.ReadToEnd()
. Eu estou supondo que a camada adicional deve ter um desempenho um pouco mais lento queStreamReader.ReadToEnd()
.ReadAllText
é apenas um invólucrostreamReader.ReadToEnd();
?Aqui está a documentação do MSDN
fonte
Dê uma olhada no método File.ReadAllText ()
Algumas observações importantes:
fonte
string text = File.ReadAllText("Path");
você tem todo o texto em uma variável de sequência. Se você precisar de cada linha individualmente, poderá usar o seguinte:fonte
fonte
@Cris sorry .This is quote
MSDN Microsoft
Metodologia
Neste experimento, duas classes serão comparadas. A
StreamReader
eaFileStream
classe será direcionado para ler dois arquivos de 10K e 200K em sua totalidade a partir do diretório do aplicativo.Resultado
FileStream
é obviamente mais rápido neste teste. Demora mais 50% a mais paraStreamReader
ler o arquivo pequeno. Para o arquivo grande, demorou mais 27% do tempo.StreamReader
está procurando especificamente quebras de linha, enquantoFileStream
isso não acontece. Isso será responsável por parte do tempo extra.Recomendações
Dependendo do que o aplicativo precisa fazer com uma seção de dados, pode haver uma análise adicional que exigirá tempo de processamento adicional. Considere um cenário em que um arquivo tenha colunas de dados e as linhas sejam
CR/LF
delimitadas. EleStreamReader
funcionaria na linha de texto procurando oeCR/LF
, em seguida, o aplicativo faria uma análise adicional procurando um local específico de dados. (Você achou que String. SubString vem sem preço?)Por outro lado, ele
FileStream
lê os dados em partes e um desenvolvedor proativo pode escrever um pouco mais de lógica para usar o fluxo em seu benefício. Se os dados necessários estiverem em posições específicas no arquivo, esse certamente é o caminho a seguir, pois mantém o uso de memória baixo.FileStream
é o melhor mecanismo de velocidade, mas exigirá mais lógica.fonte
StreamReader.ReadToEnd
?bem, o significado da maneira mais rápida com o menor código C # possível é provavelmente este:
fonte
se você quiser escolher um arquivo da pasta Bin do aplicativo, tente seguir e não se esqueça de manipular exceções.
fonte
você pode usar :
fonte
fonte
Para os noobs por aí que acham essas coisas divertidas e interessantes, a maneira mais rápida de ler um arquivo inteiro em uma string na maioria dos casos (de acordo com esses benchmarks ) é o seguinte:
No entanto, o mais rápido absoluto para ler um arquivo de texto em geral parece ser o seguinte:
Contra várias outras técnicas , ganhou na maioria das vezes, inclusive contra o BufferedReader.
fonte
Você pode usar assim
Espero que isso ajude você.
fonte
você pode ler um texto de um arquivo de texto para uma string da seguinte maneira:
fonte
fonte
Fiz uma comparação entre um ReadAllText e StreamBuffer para um csv de 2Mb e parecia que a diferença era bastante pequena, mas o ReadAllText parecia levar a vantagem dos tempos necessários para concluir as funções.
fonte