Рубрика «Программирование» - 1022

Переписывал на работе кусок одного сервиса с 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
  • PyPi — BeautifulSoup 3
  • PyPi — BeautifulSoup 4
  • PyPi — html5lib
  • Node.JS — cheerio
  • Node.JS — htmlparser
  • Node.JS — jsdom
  • C — libxml2 (скорее для справки)

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

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

В языках с автоматическим управлением памятью сборщик мусора удаляет объекты, когда они перестают быть доступными по ссылкам. Обычно это именно то, что нужно: объект существует, пока есть возможность к нему обратиться.
Иногда такое поведение не подходит. Например, программе понадобилось хранить некоторую вспомогательную информацию об экземплярах некоторого класса, но у вас нет возможности добавить в этот класс своё поле. В этом случае можно создать отображение, в котором ключом будет объект, а значением — вспомогательная информация.
Вот тут-то и начинаются проблемы. Поскольку отображение хранит ссылки на ключи, те объекты, к которым была привязана вспомогательная информация, перестают освобождаться из памяти. Если программа в процессе своей работы создаёт много объектов, память рано или поздно заканчивается.Читать полностью »

Не без волнения пишем этот пост — да, мы взялись за организацию первого в России PyCon. Если совсем кратко — то можно перейти на сайт PyCon.ru вся информация есть там. А под катом мы рассказываем, кто мы такие и почему собираемся всё провести именно так.
Читать полностью »

Я работаю программистом более 5 лет (web), и хотел бы поделиться методикой, которая экономит силы, время и помогает автоматизировать процесс проектирования.

Методика основана на объектно-ориентированном проектировании, но несколько необычна. Зато имеет очевидные плюсы:
— в идеале, программирование по CORE сводится к описанию задачи (код близок к бизнес-логике)
— чётко разделяет систему на слабосвязанные компоненты
— легко автоматизируема, позволяет генерировать осмысленный код

Почему методика называется CORE и как это расшифровывается? Отчасти потому, что у меня тяга к красивым названиям. По буквам:
Context — контекст вычислений (что инициировало вычисления)
Object — объект, который производит вычисления
Request — действие, которое нужно совершить, чтобы объект смог продолжить вычисления
Event — событие, которое происходит с объектом

Плюсы по сравнению со стандартными способами разработки:
— ускорение стадии проектирования за счёт формализованной схемы проектирования
— ускорение стадии разработки за счёт умной генерации кода
— автоматизация создания юнит-тестов
— неглючная реализация бизнес-логики практически любой сложности
— простая поддержка кода
— простота совместного владения кодом

Минусы стандартных способов по сравнению с CORE:
— часто нельзя окинуть одним взглядом всю часть системы
— нужно самому продумывать когда и в каком месте будут вызываться обработчики тех или иных действий. CORE разруливает вызовы автоматически.
— часто вводятся дополнительные уровни абстракции, не связанные с бизнес-логикой, чтобы реализовать её особенности. в CORE это не нужно.
— программист часто совершает кучу однообразных действий, которые легко можно автоматизировать
— юнит-тестирование внедрять тяжелее

Читать полностью »

Недавно я принимал участие в психологическом эксперименте для программистов. Мой друг, Майк Хансен, занимался исследованием того, как разные люди разбирают программы. Его целью было выяснение того, какие из функций в IDE помогают программистам разбираться с тем, с чем они имеют дело, и как это может быть использовано для создания систем, способных улучшить качество ПО.

Сейчас Майк занят примерно следующим экспериментом: он показывает людям несколько небольших программ на Python и просит их угадать результат работы каждой из них. Само тестирование производится при помощи слежения за траекторией движения глаз, так что после завершения теста Майк может посмотреть, куда вы направляли свой взгляд во время эксперимента.
Читать полностью »

Доброго времени суток. Я хочу порассуждать о такой, казалось бы, банальной вещи, как логи.

Ни для кого не секрет, что логирование занимает важное место в отладке и поддержке практически любого мало-мальски сложного продукта. Что может быть проще — вставлять значение переменной куда-то в поясняющую строку, да скинуть в файл. Но тут могут ждать несколько подводных камней, на них я и остановлюсь.
Читать полностью »

Многоядерная JIT компиляция в .NET 4.5
Исторически разработчики .NET использовали генератор образов в машинном коде Ngen. Это отлично работает, если у вас есть инсталлятор, и вы можете сгенерировать эти образы во время установки приложения. Но в других случаях, например когда у вас нет установщика или вы не имеете доступ к Ngen, ваше приложение будет производить JIT-компиляцию по мере необходимости, что замедлит его загрузку. Разработчики CLR предоставили решение в новой версии .NET – многоядерная JIT-компиляция с возможностью создавать профили оптимизации.
Читать полностью »

В статье представлено моё видение на эволюцию функциональной парадигмы программирования и процессы популяризации функциональных языков программирования на примере языка Haskell. Изучаются причины общей низкой популярности как функционального программирования, так и одного из его «флагманов». Приводятся факторы, которые не позволят языку программирования Haskell стать таким же широко используемым языком, как Java, C++, PHP и др.

Читать полностью »

Моя прошлая статья Приемы написания скриптов на Bash вызвала жаркие дебаты в комментариях. Основной ее посыл был в использовании библиотеки функций. Кроме того я описал способ разбора параметров в Bash. Благодарю всех за конструктивные комментарии. Обращаю Ваше внимание, что статья предполагается для широкого круга читателей, а не адресована исключительно системным администраторам.

Продолжим начатое, и на реальном примере дополним подход к разбору параметров и унификации функционала скриптов.
Читать полностью »

IT Компот 34. Конференция RailsClub 2012. Про Ruby и не только
После минувшего конца света мы записали новый выпуск и обсуждаем конференцию RailsClub 2012, недавно прошедшую в Ульяновске. Что нового и интересного в мире Ruby-разработки. Функциональное программирование и PostgreSQL. Интервью с авторами популярного подкаста, посвященного Ruby, Иваном Самсоновым и Иваном Евтуховичем.

В выпуске:

— Конференция RailsClub 2012. Программа выступлений.

— Интервью с авторами Ruby NoName Podcast: Иваном Самсоновым и Иваном Евтуховичем.

IT Компот 34. Конференция RailsClub 2012. Про Ruby и не только Подписаться в iTunes
IT Компот 34. Конференция RailsClub 2012. Про Ruby и не только RSS Feed
Cлушать на podfm
Скачать файл (68.5 Мб/01:14:46 MP3, 128 kbps)
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js