Отказ от jParser (в пользу работы напрямую с буферами Node.js) ускоряет скрипт на порядок

    Перелистнём несколько страниц недавнего прошлого.

    16 мая 2012 года RReverser во блогозаписи «Javascript BMP Parser» рассказал об употреблении модуля jParser для анализа двоичных данных, во браузере совершаемого.

    На следующий же день (17 мая 2012 года) во блогозаписи «jParser: анализ двоичных файлов работает просто» я перевёл документацию по jParser, а чуть позже (22 мая 2012 года во блогозаписи «Node.js на узле Фидонета: читаем джаваскриптом заголовки эхопочты, хранимой в формате JAM») поделился собственным опытом употребления этого модуля (на сей раз — на Node.js, а не во браузере).

    Прошло ≈1⅓ года…

    12 сентября нынешнего (2013) года во блогозаписи «Недоволен скоростью джаваскриптов? — Подожди год-полтора, и это пройдёт!» я выразил неудовольствие от скорости работы модуля, прежде мною сочинённого, и указал на один только повод для оптимизма: поступательное развитие Node.js от версии 0.6 до версии 0.10 привело к росту скорости моего кода в три раза.

    А сегодня события совершили полный круг — я напрочь отказался от употребления jParser. И достигнутый результат (как неприятная, так и радостная сторона его) оказался заслуживающим внимания.

    Позвольте же поделиться с вами как впечатлениями, так и исходниками.



    Неприятная сторона вот какова: отказ от jParser в пользу работы напрямую с буферами Node.js неизбежно приводит к распуханию кода.

    Вы можете посмотреть на Гитхабе внесённые мною правки и судить о том самостоятельно. Всюду в коде, где для jParser хватало одного свойства в объекте (например, «'MSGIDcrc': ulong»), там работа с буфером занимает две строки:

    nextHeader.MSGIDcrc = _JAM.JHR.readUInt32LE(offsetJHR);
    offsetJHR += 4; //ulong 
    

    И вот такою писаниною приходится заниматься для каждого, для каждого из полей объекта, считываемого из двоичных данных!

    (Мой код занимается чтением заголовков фидонетовской почты, хранимой в формате JAM. Всякий, кто когда-либо читал документацию по этому формату, уж знает, что в таком заголовке — два десятка полей.)



    Радостная же новость заключается в том, что отказ от jParser существенно ускоряет работу скрипта. Сравнив при помощи сервиса Travis CI время работы теста до правок, мною внесённых, и после правок, нетрудно увидать следующие результаты:


    Ускорение примерно на порядок!

    Достигнув такого результата, уместно заодно посмотреть и на табличку «Is It Worth the Time?» в комиксе XKCD №1205. Там рассказывается, например, что если Вы потратили два часа усилий (переменив некоторый код) и выиграли одну секунду во времени работы такой функции, которая станет выполняться реже пяти раз в сутки, то это время потрачено зря (потому что окупаться оно будет больше пяти лет — а после пяти лет, чего доброго, и актуальность кода окажется под вопросом).

    Если скорость набора кода важнее для вас, то используйте jParser: это позволит экономить усилия.

    Если скорость работы кода важнее для вас, то откажитеся от jParser: это позволит ускорить скрипт.

    Для моего-то модуля ускорение на секунду при чтении заголовков даже одной эхоконференции весьма существенно, потому что на типичном узле Фидонета таких эхоконференций бывает несколько десятков, а на сколько-нибудь крупном — даже несколько сотен (пример).

    Прощай, jParser.
    Share post
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 14

      +2
      Попиарюсь — просмотрите на node-struct.
      Впрочем это не совсем полный аналог jParser — нет условных полей.
      Зато ничего собственно не парсится, а просто вычисляется позиция в буфере, где надо читать/писать и сколько.
      Есть аналоги, например вот это ref-struct.
        –2
        Кстати, да. Buffer во многих случаях достаточен.

        p.s.
        Любители попрограммить Фидо-форматы в наше время выглядят, как любители попрограммить на brainfuck, с той разницей, что последние честно и открыто заявляют, что фигней маются, а «фидошники» еще и подводят какой-то идеологический базис :)
        • UFO just landed and posted this here
          • UFO just landed and posted this here
              0
              если всё будет благополучно обстоять с визой, то вскоре о нём расскажу также в Сан-Франциско
              Было бы неплохо.

              Кстати, чем в основном jBinary отличается от jParser к лучшему? Есть где-нибудь сравнение?
              • UFO just landed and posted this here
                  +1
                  Боюсь, вы также ввели читателей в заблуждение (писал уже в личку, возможно не заметили)
                  Спасибо, исправил и даже отписал в личку Вам минут за ≈пятнадцать до публикации этого Вашего комментария. (Возможно, на сей раз не заметили ужé Вы. Оно и понятно; уведомление о новых личных сообщениях располагается в шапке Хабрахабра мелким шрифтом, так что его не просто бывает заметить без промедления.)
                  • UFO just landed and posted this here
            • UFO just landed and posted this here
                –1
                Сервис _наверное_ хороший, но дальше формы регистрации я не попал. Ни через один из соц. сервисов войти не смог — или ошибка про дату или просто редирект на форму регистрации, пароль показывается в поле даже если галка «Показать пароль» снята (http://d.pr/i/dlF1)
                • UFO just landed and posted this here
                    +1
                    Так и есть, прошу прощения
                  +1
                  буду выглядеть непонятно как, но все равно: Мицгол, спасибо за Travis CI!
                  как раз искал нечто похожее для проекта.
                    0
                    Пожалуйста.

                  Only users with full accounts can post comments. Log in, please.