Я хочу напечатать список интегралов, разделенных пробелами в stdout. Генерация списка выполняется быстро, поэтому я попытался решить эту проблему с помощью последовательности [1..200000].Эффективный вывод чисел
В C, я могу реализовать это следующим образом:
#include "stdio.h"
int main()
{
int i;
for(i = 0; i <= 200000; ++i)
printf("%d ", i);
return 0;
}
Самое быстрое решение в Haskell я мог бы реализовать примерно в три раза медленнее:
import Data.List (intercalate)
main = putStr . intercalate " " . map (show) $ [1..(200000)]
Я попытался байтовых строк в некоторых отношениях, но с ними он стал еще медленнее. Большие проблемы, похоже, являются преобразованием целых чисел в строки с показом (или преобразованием в ByteStrings).
Любые предложения, как ускорить это, не взаимодействуя с C? Он не должен становиться сложным (как можно короче и красивее, с использованием других модулей Haskell).
Как всегда, профилирование >>>>> угадывание. – delnan 2010-11-26 13:47:45
Вы проверяли скорость записи каждого элемента за раз? Запись на консоль обычно медленная, поэтому это может быть намного хуже, но, возможно, стоит попробовать. Вы могли бы попытаться собрать кусок определенного количества элементов, а не огромную строку, однако вам может понадобиться использовать append (++) или список Hughes (DList), чтобы сделать это, что добавляет дополнительную работу. Вот почему я предполагаю, что писать каждый элемент может быть конкурентоспособным. – 2010-11-26 16:17:51
Я попробовал версию, которая записывала число за раз (как я думал то же самое), но это было медленнее. – 2010-11-26 16:24:58