Quando uso o ByteString e quando não?

Eu tenho tentado bastante mal o problema do PRIME1 no SPOJ. Eu descobri usando isso usando ByteStringrealment ajudou no desempenho da leitura no texto do problema. No entanto, o uso do ByteString para gravar os resultados é realmente um pouco mais lento do que o uso das funções do Prelude. Estou tentando descobrir se estou fazendo algo errado ou se isso é esperad

Conduzi perfis e tempos usando (putStrLn.show) e os equivalentes ByteString de três maneiras diferentes:

Teste cada candidato para ver se é excelente. Nesse caso, adiciono-o a uma lista e escrevo-o com (putStrLn. Show)Fiz uma lista de todos os números primos e escrevo a lista usando (putStrLn. Unlines. Show)Fiz uma lista de todos os números primos e escrevo a lista usando map (putStrLn. Show)

Eu esperava que os números 2 e 3 tivessem um desempenho mais lento à medida que você cria uma lista em uma função e a consome em outra. Ao imprimir os números à medida que os gero, evito alocar qualquer memória para a lista. Por outro lado, você está fazendo uma chamada do sistema de chamada a cada chamada para putStrLn. Direita? Então eu testei e o número 1 foi de fato o mais rápid

O melhor desempenho foi alcançado com a opção nº 1 e as funções Prelude ([Char]). Eu esperava que meu melhor desempenho fosse a opção nº 1 com ByteString, mas esse não foi o caso. Eu só usei ByteStrings preguiçosos, mas não achei que isso importaria. Seria?

Algumas perguntas

você esperaria que o ByteStrings tivesse um desempenho melhor ao escrever um monte de números inteiros no stdout?stou perdendo um padrão de maneira de gerar e escrever as respostas que levariam a um melhor desempenhSe eu estiver escrevendo apenas números como texto, quando, se houver, há algum benefício em usar o ByteString?

Minha hipótese de trabalho é que escrever Integer com ByteString é mais lento se você não os estiver combinando com outro texto. Se você estiver combinando Inteiros com [Char], obterá melhor desempenho trabalhando com ByteStrings. Ou seja, a ByteString reescreve de:

putStrLn $ "the answer is: " ++ (show value)

será muito mais rápido que a versão escrita acima. Isso é verdade

Obrigado pela leitura!

questionAnswers(2)

yourAnswerToTheQuestion