Markov C ++ Leia no desempenho do arquivo
Pergunta
Eu tenho minha 2ª tarefa para a classe C ++, que inclui cadeias de Markov. A tarefa é simples, mas não consigo descobrir qual é a melhor implementação ao ler chars a partir de arquivos.
Eu tenho um arquivo em torno de 300k. Uma das regras para a tarefa é usar classes de mapa e vetor. No mapa (a chave é apenas a string) e os valores serão os vetores. Quando estou lendo o arquivo, preciso começar a coletar pares de chaves.
Exemplo:
File1.txt
1234567890
1234567890
Se selecionar Markov K = 3, eu deveria ter no meu mapa:
key vector
123 -> 4
456 -> 7
789 -> 0
0/n1 -> 2
234 -> 5
567 -> 8
890 -> /n
/n -> NULL
A sugestão do professor é ler char por char, então meu algoritmo é o seguinte
while (readchar != EOF){
tempstring += readchar
increment index
if index == Markovlevel {
get nextchar if =!EOF
insert nextchar value in vector
insert tempstring to Map and assign vector
unget char
}
}
Eu omito alguns outros detalhes. Minha principal pergunta é que, se eu tiver 318.000 caracteres, estarei fazendo o condicional toda vez que diminui muito o meu computador (novo Mac Pro). Um programa de amostra do professor executa esse arquivo em cerca de 5 segundos.
Não consigo descobrir qual é o melhor método para ler palavras de comprimento fixo de um arquivo de texto em C ++.
Obrigado!
Solução
Você realmente cronometrou o programa? 318.000 condicionais devem ser um pedaço de bolo para o seu novo Mac Pro. Isso deve levar apenas microssegundos.
Otimização prematura é a raiz de todo o mal. Faça o seu programa funcionar primeiro, a otimização fica em segundo lugar.
Outras dicas
A leitura repetida de arquivos desacelerará o programa.
Leia o arquivo em blocos, do tamanho 1024, colocado em um buffer. Em seguida, processe esse buffer conforme necessário para a atribuição. Repita o próximo bloco até terminar o arquivo.