He estado haciendo intentos bastante pobres en el problema PRIME1 en SPOJ. Descubrí que usar ByteString realmente ayudó a rendimiento para leer en el texto del problema. Sin embargo, usar ByteString para escribir los resultados es en realidad un poco más lento que usar las funciones de Preludio. Estoy tratando de averiguar si lo estoy haciendo mal, o si esto es lo que se espera.¿Cuándo uso ByteString y cuándo no?
He realizado perfilado y el tiempo usando (putStrLn.show) y el ByteString equivalentes de tres maneras diferentes:
- I prueba cada candidato para ver si es primo. Si es así, lo agrego a una lista y escribo con (putStrLn. espectáculo)
- que hacer una lista de todos los números primos y escribir la lista mediante (putStrLn. Unlines espectáculo.)
- I hacer una lista de todos los números primos y escribir la lista mediante mapa (putStrLn. espectáculo)
que esperaba los números 2 y 3 para realizar más lenta a medida que está construyendo una lista en una función y consumirlo en otro. Al imprimir los números a medida que los genero, evito asignar memoria a la lista. Por otro lado, está realizando una llamada al sistema de llamadas con cada llamada a putStrLn. ¿Derecha? Así que probé y el n. ° 1 fue, de hecho, el más rápido.
El mejor rendimiento se logró con la opción # 1 y las funciones Preludio ([Char]). Esperaba que mi mejor rendimiento fuera la opción n. ° 1 con ByteString, pero este no era el caso. Solo usé ByteStrings perezoso, pero no pensé que esto fuera importante. ¿Verdad?
Algunas preguntas:
- se puede esperar a los ByteString funcionan mejor para escribir un montón de enteros en la salida estándar?
- ¿Me falta un patrón de forma a generar y escribir las respuestas que conducirían a un mejor rendimiento de ?
- Si solo estoy escribiendo números como texto , ¿cuándo, si alguna vez, hay un beneficio de al usar ByteString?
Mi hipótesis de trabajo es que escribir enteros con ByteString es más lento si no los está combinando con otro texto. Si está combinando enteros con [Char], obtendrá un mejor rendimiento trabajando con ByteStrings. Es decir, la reescritura de ByteString:
putStrLn $ "the answer is: " ++ (show value)
será mucho más rápido que la versión escrita anteriormente. ¿Es esto cierto?
¡Gracias por leer!
¿Puede indicarme las agallas de una de las bibliotecas mencionadas anteriormente? Es decir, ¿la sección que transmite la conversión a un buffer en constante crecimiento? No estoy familiarizado con las partes internas de ninguna de esas bibliotecas. ¿Haría renderHtml en Text.Blaze.Renderer.UTF8 ser un ejemplo de esto? –
P.E. en binario un [generador] (http://hackage.haskell.org/packages/archive/binary/0.5.0.2/doc/html/src/Data-Binary-Builder.html#Builder) es una función de continuación que actualiza un buffer mutable, asincrónicamente. –
Parece que tengo mi tarea de lectura por la noche. ¡Gracias! –