Tag Archives: NodeJS

[ПЕРЕВОД] Коллбеки императивны, обещания функциональны: крупнейшее упущение NodeJS.

Перевод статьи James Coglan Callbacks are imperative, promises are functional: Node’s biggest missed opportunity

“Главная особенность обещаний в том, что они невосприимчивы к изменяющимся обстоятельствам”
Франк Андервуд, “Карточный домик”

Возможно, вы часто слышите, что JavaScript это “функциональный” язык программирования. Его так называют просто потому, что функции в нём – объекты первого рода: многие другие особенности, присущие функциональным языкам, такие как неизменяемые данные, предпочтение циклам рекурсии, алгебраические системы типов, избежание побочных эффектов – полностью отсутствуют. И, хотя функции высшего порядка, безусловно, полезны и позволяют программирвать в функциональном стиле, но представление, что JS это функциональный язык, зачастую затмевает основной аспект функционального программирования – программирование со значениями.

Continue reading

Бенчмарк HTML парсеров

Переписывал на работе кусок одного сервиса с Python на Erlang. Сам сервис занимается тем, что скачивает по HTTP значительное количество однотипных HTML страниц и извлекает из них некоторую информацию. Основная CPU нагрузка сервиса приходится на парсинг HTML в DOM дерево.

Сперва захотелось сравнить производительность Erlang парсера mochiweb_html с используемым из Python lxml.etree.HTML(). Провел простейший бенчмарк, нужные выводы сделал, а потом подумал что неплохо было бы добавить в бенчмарк ещё парочку-другую парсеров и платформ, оформить покрасивее, опубликовать код и написать статью.
На данный момент успел написать бенчмарки на Erlang, Python, PyPy, NodeJS и С в следующих комбинациях:

  • Erlang – mochiweb_html
  • CPython – lxml.etree.HTML
  • CPython – BeautifulSoup 3
  • CPython – BeautifulSoup 4
  • CPython – html5lib
  • PyPy – BeautifulSoup 3
  • PyPy – BeautifulSoup 4
  • PyPy – html5lib
  • Node.JS – cheerio
  • Node.JS – htmlparser
  • Node.JS – jsdom
  • C – libxml2 (скорее для справки)

В тесте сравниваются скорость обработки N итераций парсера и пиковое потребление памяти.

Интрига: кто быстрее – Python или PyPy? Как сказывается иммутабельность Erlang на скорости парсинга и потреблении памяти? Насколько быстра V8 NodeJS? И как на всё это смотрит код на чистом C. Continue reading