Je souhaite imprimer une liste d'intégrales séparées par des espaces sur stdout. La génération de la liste est rapide, j'ai donc essayé de résoudre ce problème avec la séquence [1..200000].Sortie efficace des nombres
En C, je peux le mettre en œuvre comme ceci:
#include "stdio.h"
int main()
{
int i;
for(i = 0; i <= 200000; ++i)
printf("%d ", i);
return 0;
}
La solution la plus rapide dans Haskell je pourrais mettre en œuvre est environ trois fois plus lent:
import Data.List (intercalate)
main = putStr . intercalate " " . map (show) $ [1..(200000)]
j'ai essayé des chaînes ordinaires à certains égards, mais avec eux, c'est encore plus lent. Les gros problèmes semblent être la conversion des entiers en chaînes avec show (ou la conversion en ByteStrings).
Des suggestions pour accélérer ce processus sans interfaçage avec C? Cela ne devrait pas devenir compliqué (aussi court et beau que possible, l'utilisation d'autres modules Haskell est très bien).
Comme toujours, le profilage >>>>> deviner. – delnan
Avez-vous vérifié la vitesse d'écriture de chaque élément à la fois? Ecrire sur la console est généralement lent, donc cela peut être bien pire, mais cela vaut la peine d'essayer. Vous pourriez essayer de construire un morceau d'un certain nombre d'éléments plutôt qu'une énorme chaîne, mais vous devrez peut-être utiliser append (++) ou une liste Hughes (DList) pour faire cela, ce qui ajoute du travail supplémentaire. C'est pourquoi je suppose que l'écriture de chaque élément pourrait être compétitif. –
J'ai essayé une version qui a écrit un nombre à la fois (comme je pensais la même chose), mais c'était plus lent. –