Я делал довольно плохие попытки проблемы PRIME1 на SPOJ. Я обнаружил, что использование ByteString действительно помогло производительности для чтения в тексте проблемы. Однако использование ByteString для вывода результатов на самом деле немного медленнее, чем использование функций Prelude. Я пытаюсь понять, если я делаю это неправильно, или если это ожидается.
Я провел профилирование и время, используя (putStrLn.show) и эквиваленты ByteString тремя разными способами:
- Я проверяю каждого кандидата, чтобы узнать, является простым. Если это так, я добавляю его в список и напишите его (putStrLn. шоу)
- Я делаю список всех простых чисел и запишите список, используя (putStrLn. unlines. show)
- Я делаю список всех простых чисел и запишите список, используя map (putStrLn. show)
Я ожидал, что числа 2 и 3 будут выполняться медленнее, когда вы создаете список в одной функции и потребляете его в другом. При печати чисел по мере их создания я избегаю выделения какой-либо памяти для списка. С другой стороны, вы вызываете системный вызов вызова с каждым вызовом putStrLn. Правильно? Итак, я тестировал, а №1 был самым быстрым.
Наилучшая производительность была достигнута с опциями # 1 и Prelude ([ Char]). Я ожидал, что моя лучшая производительность будет вариантом № 1 с ByteString, но это было не так. Я использовал только ленивый ByteStrings, но я не думал, что это имеет значение. Будет ли это?
Некоторые вопросы:
- Вы ожидаете, что ByteStrings лучше работать для написания Целые числа в stdout?
- Я пропустил шаблон пути генерировать и записывать ответы что приведет к улучшению производительность?
- Если я только пишу цифры, текст, когда, если когда-либо, есть извлечь выгоду из использования ByteString?
Моя рабочая гипотеза заключается в том, что запись Integer с ByteString происходит медленнее, если вы не комбинируете их с другим текстом. Если вы комбинируете целые числа с [ Char], вы получите лучшую производительность, работающую с ByteStrings. I.e., ByteString переписывает:
putStrLn $ "the answer is: " ++ (show value)
будет намного быстрее, чем версия, написанная выше. Это правда?
Спасибо за чтение!