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