Когда я могу использовать ByteString, а когда нет?

, я делал довольно неудачные попытки решить проблему PRIME1 на SPOJ. Я обнаружил, что использование ByteString действительно помогает производительности при чтении текста проблемы. Однако использование ByteString для записи результатов на самом деле немного медленнее, чем использование функций Prelude. Я пытаюсь понять, делаю ли я это неправильно или этого ожидаемо.

Я провел профилирование и тайминг, используя (putStrLn.show) и эквиваленты ByteString тремя разными способами:

  1. Я тестирую каждый кандидат, чтобы увидеть, Я делал довольно неудачные попытки решить проблему PRIME1 на SPOJ. Я обнаружил, что использование ByteString действительно помогает производительности при чтении текста проблемы. Однако использование ByteString для записи результатов на самом деле немного медленнее, чем использование функций Prelude. Я пытаюсь понять, делаю ли я это неправильно или этого ожидаемо.

    Я провел профилирование и тайминг, используя (putStrLn.show) и эквиваленты ByteString тремя разными способами:

    1. Я тестирую каждый кандидат, чтобы увидеть, Я делал довольно неудачные попытки решить проблему PRIME1 на SPOJ. Я обнаружил, что использование ByteString действительно помогает производительности при чтении текста проблемы. Однако использование ByteString для записи результатов на самом деле немного медленнее, чем использование функций Prelude. Я пытаюсь понять, делаю ли я это неправильно или этого ожидаемо.

      Я провел профилирование и тайминг, используя (putStrLn.show) и эквиваленты ByteString тремя разными способами:

      1. Я тестирую каждый кандидат, чтобы увидеть, простое. Если да, то добавляю в список и запишите это с помощью (putStrLn. show)
      2. Я составляю список всех простых чисел и напишите список, используя (putStrLn. unlines. show)
      3. Я составляю список всех простых чисел и напишите список, используя map (putStrLn. show)

      Я ожидал, что числа 2 и 3 будут работать медленнее, поскольку вы создаете список в одной функции и используете его в другой. Распечатывая числа по мере их создания, я избегаю выделения памяти для списка. С другой стороны, вы выполняете системный вызов call с каждым вызовом putStrLn. Правильно? Итак, я протестировал, и на самом деле №1 оказался самым быстрым.

      Наилучшая производительность была достигнута с вариантом №1 и функциями Prelude ([Char]). Я ожидал, что моей лучшей производительностью будет вариант №1 с ByteString, но этого не произошло. Я использовал только ленивые ByteStrings, но не думал, что это имеет значение. Может?

      Некоторые вопросы:

      • вы ожидаете, что ByteStrings будет лучше работать для написания кучи Целые числа в стандартный вывод?
      • Мне не хватает шаблона пути для генерировать и записывать ответы это приведет к лучшему производительность?
      • Если я пишу только числа как текст, когда, если вообще, есть выгода от использования ByteString?

      Моя рабочая гипотеза заключается в том, что запись Integer с ByteString происходит медленнее, если вы не объединяете их с другим текстом. Если вы комбинируете целые числа с [Char], тогда вы получите лучшую производительность при работе с ByteStrings. Т.е. перезапись ByteString:

      putStrLn $ "the answer is: " ++ (show value)
      

      будет намного быстрее, чем версия, написанная выше. Это правда?

      Спасибо за чтение!

24
задан Don Stewart 12 May 2011 в 00:05
поделиться