корень зла (программистское)
Dec. 1st, 2009 05:07 pmЛюбопытная попытка написать супер-оптимизированный HTTP request/response parser. Намерения самые добрые, но... мне кажется, в этом небольшом модуле я смог бы набрать материала на часовую лекцию о том, когда не надо оптимизировать и как не надо.
Даже проглядев его вскользь, я вижу несколько мест, где на первый взгляд очень эффективный подход на самом деле даст относительно медленный код, который легко можно улучшить; а также заодно и место, где есть потенциальный buffer overflow. Утверждение автора, что его модуль "...is nearly optimal in its use of CPU instructions", конечно, слишком оптимистично. Но главное - почти наверняка выбранная модель общения с клиентом, через колбэки, на практике приведет к большим потерям времени и эффективности, чем столь тщательно сынженированные ручные подгонки под названия HTTP-методов, или отсутствие malloc()-ов.
Меж тем проект, ради которого это затеяно, Node.js (быстрый V8-джаваскрипт на сервере), весьма интересен.
Даже проглядев его вскользь, я вижу несколько мест, где на первый взгляд очень эффективный подход на самом деле даст относительно медленный код, который легко можно улучшить; а также заодно и место, где есть потенциальный buffer overflow. Утверждение автора, что его модуль "...is nearly optimal in its use of CPU instructions", конечно, слишком оптимистично. Но главное - почти наверняка выбранная модель общения с клиентом, через колбэки, на практике приведет к большим потерям времени и эффективности, чем столь тщательно сынженированные ручные подгонки под названия HTTP-методов, или отсутствие malloc()-ов.
Меж тем проект, ради которого это затеяно, Node.js (быстрый V8-джаваскрипт на сервере), весьма интересен.
no subject
Date: 2009-12-01 07:02 pm (UTC)1) зачем вообще оптимизировать http parser. Неужели это составляют хоть сколько-нибудь значимую часть нагрузки на веб сервер?
2) зачем JavaScript на сервере?
no subject
Date: 2009-12-01 07:18 pm (UTC)no subject
Date: 2009-12-01 07:23 pm (UTC)no subject
Date: 2009-12-01 10:36 pm (UTC)no subject
Date: 2009-12-01 07:19 pm (UTC)2) JS, в общем, хороший и мощный динамический язык, если правильно на него смотреть (см. Крофорд итд.). Под V8 он к тому же еще и очень быстрый, и наверное (говорю это от фонаря - сам не проверял!) вполне может поспорить по скорости, скажем, с Питоном или ПХП. А вместе с event-driven IO, который добавляет этот самый Node.js, он становится сравним с продвинутыми фреймворками на динамических языках, типа Twisted.
Так что писать на нем сайты - возможность как минимум интересная; хотя, конечно, несравнимо более бедные библиотеки, это да. С другой стороны, "все" уже знают Джаваскрипт.
no subject
Date: 2009-12-01 07:41 pm (UTC)Мне в нашей индустрии очень не нравится то, что нет даже намека на консенсус о том, как нужно делать какие-то простейшие стандартные вещи. Что может быть стандартней, чем написать веб апп? А вот поди ж ты пойми, как это сейчас правильно делать. Есть 10 разных фреймворков на 5 разных языках, все тянут в свою сторону, а воз и ныне там. Каждый год один-два фреймворка исчезают, один-два появляются, и даже нет ощущения, что новые учатся на ошибках старых, скорее просто пробуют что-нибудь новенькое. Сделаем фреймворк на Яваскрипте, потом ещё один на Го, потом ещё че-нибудь придумаем.
"Все" знают Яваскрипт -- не согласен, все знают DOM+JavaScript, это мало поможет в написании серверных приложений.
no subject
Date: 2009-12-01 09:16 pm (UTC)Я скорее соглашусь с вами в пределах одного языка (скажем, на питоне этих фреймворков действительно как собак нерезаных, неприятно), но не между языками.
no subject
Date: 2009-12-01 08:52 pm (UTC)no subject
Date: 2009-12-01 09:17 pm (UTC)no subject
Date: 2009-12-02 02:38 am (UTC)no subject
Date: 2009-12-02 09:10 am (UTC)CPython в 1000 раз медленней C/Java/C++/C#/...
Java/С# подразумеваются без ООП. Когда начинается ООП и "коллекции", то невозможность заводить переменные на стеке или как подобъекты делают всё плохо.
Python подразумевается без операций со строками. Когда мы начинаем работать со строками, то всё очень хорошо, так как они уже написаны и оптимизированы на C.
JavaScript мне показался очень неприятным языком - с массивами работать неприятно. Надо или использовать старые сишные for-циклы, или мириться с ограниченным набором методов массивов типа .map. Ещё эти массивы мягко говоря неустойчивы к ошибкам, дефолтный undefined вместо ranger error.
no subject
Date: 2009-12-02 09:56 am (UTC)цифры в студию или Вы глюпый попугай.
no subject
Date: 2009-12-02 07:02 pm (UTC)http://www.everfall.com/paste/id.php?qwqfd6ztdzbv - JavaScript.
http://www.everfall.com/paste/id.php?9picufx8zkno - C++
Оба куска кода должны выводить 17, посчитаное сложным образом.
no subject
Date: 2009-12-06 08:27 pm (UTC)энивей, не вполне понятно что именно Вы в результате проверили: то ли качество оптимизации вычислений с плавающей точкой (gcc там реально жжот, надо отметить, причём, если я правильно понимаю, на уровне peephole optimization — никакие типы к тому этапу трансляции по-любому уже не при делах), то ли качество аллокатора (мусора Ваш жабоскриптовый вариант генерит, вполне очевидно, метрические гигабайты в секунду), то ли скорость диспатча в их какбэ объектно-ориентированной парадигме (которую я вообще слабо понимаю, но которая врядли позволяет реально быструю реализацию как в принципе, хотя конечно фиг знает).
жабоскрипт вообще и v8 в частности я знаю соответственно хреново и никак, так что я перевёл Ваш цеплюсплюс на common lisp и натравил на него sbcl. после добавления пары оптимизационных деклараций и некоторого жульничества (с целью перестать проводить всю жизнь в GC) получил время работы всего в 3 раза медленнее C++, так что вот. можно наверное ещё разогнать, хотя судя по тому что показывает дизассемблер особо некуда -- разве что какая-нибудь умная добрая душа наваяет для sbcl пацанский peephole optimizer...
no subject
Date: 2009-12-01 09:14 pm (UTC)no subject
Date: 2009-12-02 02:11 am (UTC)Из смешных приложений JS на сервере я тесно общался с VoiceXML. Там авторы хотели сделать, чтобы все выглядило типа как HTML (простим им, в середине 90-х многие были очарованы), но поскольку никакого броузера там нет, то парсить и исполнять JS приходилось на том же самом сервере
no subject
Date: 2009-12-02 07:42 am (UTC)Ну вообще-то - да, составляет. Даже простой accept filter в ядре уже показывал десятки процентов прироста производительности для сервера _статики_.
Впрочем, я лично с HTTP в этом плане не работал, работал с SIP, у которого синтаксис сделан в тех же принципах и методах как HTTP, но ещё больше грамматизирован. Так вот - его парсинг представляет собой область, в которой можно достичь как высокой эффективности, так и наоборот - кошмарных тормозов на ровном месте. С тех пор я систематически посылаю лучи диареи народу из IETF.;(
no subject
Date: 2009-12-02 01:42 pm (UTC)no subject
Date: 2009-12-02 01:47 pm (UTC)