Несколько объектов парсера Yajl против одного глобального объекта парсера

Работая в rails 3.2.1, я создаю приложение, которое выполняет большое количество запросов JSON и анализирует возвращаемые данные с помощью Yajl. Моя дилемма - погода или нет, чтобы инициализировать объект парсера Yajl каждый раз, когда запрашиваются данные JSON:

json = StringIO.new( some_jason_object)
#hmm I need something to parse this json data
parser = Yajl::Parser.new
hash = parser.parse(json)

или инициализировать синтаксический анализатор глобальной константой PARSER = Yajl::Parser.new в config/initializers/yajl_parser.rb и вызвать его из моего приложения следующим образом:

json = StringIO.new( some_jason_object)
hash = PARSER.parse(json)

Учитывая, что запросы, требующие Yajl для анализа данных, будут выполняться на большинстве запросов страниц, реализация которых обеспечивает наилучшую производительность.


person rudolph9    schedule 23.02.2012    source источник


Ответы (1)


Что плохого в простом использовании Yajl::Parser.parse json_string? В данном контексте это не должно иметь большого значения.

person omninonsense    schedule 15.03.2012
comment
Я думаю, создав константу или постоянно повторно используя инициализированный объект, мое приложение может добиться увеличения производительности, поскольку объект, вероятно, затем будет кэширован в памяти, но я недостаточно хорошо понимаю ориентацию Ruby или Ruby on Rails, чтобы принять взвешенное решение. - person rudolph9; 16.03.2012
comment
У меня часто возникают вопросы, похожие на этот, с тех пор, как я принял Ruby on Rails. В школе я несколько семестров работал с высокопроизводительными вычислениями, и мне очень хотелось бы лучше понять, как Ruby управляет памятью, особенно в контексте Ruby on Rails. Рельс приложение. - person rudolph9; 16.03.2012
comment
Хм, я редко работал с Ruby on Rails, но если вам интересно, как Ruby обрабатывает проверку памяти, данная презентация; если вы используете YARV, это может немного отличаться от презентации. Yajl::Parser уже является константой, на которую вы отправляете parse. - person omninonsense; 17.03.2012
comment
Очень полезно! Из того, что я собрал с помощью стандартного интерпретатора Ruby 1.87, будет немного эффективнее инициализировать объект, который повторно используется вместо вызова Yajl::Parser.parse json_string по мере необходимости. Я думаю, что реализация 1.87 в лучшем случае имеет зеленую резьбу, и это предотвратит необходимость очистки объектов yajl::Parser каждый раз, когда вызывается Yajl::Parser.parse json_string. - person rudolph9; 17.03.2012
comment
При этом я намереваюсь развернуть свое приложение с JRuby, который имеет более эффективную очистку мусора, запускает действительно параллельные потоки и, вероятно, будет быстрее вызывать Yajl::Parser.parse json_string по мере необходимости (хотя в целом больше работы). - person rudolph9; 17.03.2012
comment
Хотя в долгосрочной перспективе я надеюсь вернуться к стандартному интерпретатору Ruby, знакомы ли вы с докладом, похожим на тот, который вы первоначально рекомендовали, который разбивает управление памятью специально для реализации 1.9? - person rudolph9; 17.03.2012
comment
Мне не удалось найти каких-либо хороших сообщений/документации/презентаций об управлении памятью в YARV (к сожалению, поскольку я тоже хотел бы получить их в свои руки). Разница в производительности между отправкой parse в Yajl::Parser или его экземпляром незначительна. Версия экземпляра может быть немного быстрее, но немного менее удобной. - person omninonsense; 18.03.2012