avva: (Default)
[personal profile] avva
Любопытная попытка написать супер-оптимизированный HTTP request/response parser. Намерения самые добрые, но... мне кажется, в этом небольшом модуле я смог бы набрать материала на часовую лекцию о том, когда не надо оптимизировать и как не надо.

Даже проглядев его вскользь, я вижу несколько мест, где на первый взгляд очень эффективный подход на самом деле даст относительно медленный код, который легко можно улучшить; а также заодно и место, где есть потенциальный buffer overflow. Утверждение автора, что его модуль "...is nearly optimal in its use of CPU instructions", конечно, слишком оптимистично. Но главное - почти наверняка выбранная модель общения с клиентом, через колбэки, на практике приведет к большим потерям времени и эффективности, чем столь тщательно сынженированные ручные подгонки под названия HTTP-методов, или отсутствие malloc()-ов.

Меж тем проект, ради которого это затеяно, Node.js (быстрый V8-джаваскрипт на сервере), весьма интересен.
Page 1 of 3 << [1] [2] [3] >>

Date: 2009-12-01 03:23 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
ragel-то ему чем не угодил? он вроде бы то самое и делает, генерит оптимальный спагетти-код по описанию автомата.

Date: 2009-12-01 03:24 pm (UTC)
From: [identity profile] wakes-up.livejournal.com
Супер быстрый парсер для супер-медленного языка. Зачем?

Date: 2009-12-01 03:28 pm (UTC)
From: [identity profile] avva.livejournal.com
С V8 это уже отнюдь не супер-медленный язык.

Date: 2009-12-01 03:29 pm (UTC)
From: [identity profile] avva.livejournal.com
Не сомневаюсь, что по сравнению с рагелем можно вручную заметно убыстрить. Кроме того, ему было важно уместить все в constant space, не уверен, что рагель это позволяет.

"оптимальный" - опасное слово :)

Date: 2009-12-01 03:46 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
Ну, более-менее оптимальный. А то сейчас ему ragel не оптимально генерирует, а завтра - компилятор C нехорош, ассемблер подавай :)

Ну а в данном случае ragel лучше тем, что не нуждается в коллбэках - обработчик пишется просто инлайн. Хотя, конечно, и там boilerplate code нужно писать, так что тоже не идеал.

Date: 2009-12-01 03:48 pm (UTC)
From: [identity profile] arno1251.livejournal.com
Затормозился на слове "сынженированные", но возражений не нашёл :)

Date: 2009-12-01 04:01 pm (UTC)
From: [identity profile] unbe.livejournal.com
А где потенциальный buffer overflow? Я нашел только неправильный индекс у usual[], но это не buffer overflow.

Date: 2009-12-01 04:02 pm (UTC)

Date: 2009-12-01 04:07 pm (UTC)
From: [identity profile] avva.livejournal.com
c = lowcase[(int)ch];

обратите внимание, что ch - char, а не unsigned char.

Date: 2009-12-01 04:11 pm (UTC)
From: [identity profile] brainslugs.blogspot.com (from livejournal.com)
Напомнило классику http://docs.huihoo.com/nginx/nginx-modules-guide.html

Date: 2009-12-01 04:12 pm (UTC)
From: [identity profile] unbe.livejournal.com
да, верно, с usual[] та же история, но это не совсем buffer overflow.

Date: 2009-12-01 04:14 pm (UTC)
From: [identity profile] avva.livejournal.com
Ну да, чувствуется влияние философии нгинкса. А ведь эта статья, по вашей ссылке, начинается с ужасного с точки зрения перформанса куска кода. Меня это в свое время очень позабавило. В самом нгинксе с тех пор это место исправили, если память не изменяет. Мне казалось, я даже писал об этом, но сейчас не могу найти; может, как нередко случается, хотел написать, да так и не собрался.

Date: 2009-12-01 04:16 pm (UTC)
From: [identity profile] avva.livejournal.com
Скажем так, это видимо не exploitable buffer overflow, но тем не менее это он :) больше вреда, чем скормить коллбэку какое-то количество случайного мусора, который и так можно было послать самому, это не причинит. Но все равно. Я ему черкну письмо наверное.

Date: 2009-12-01 04:45 pm (UTC)
From: [identity profile] dmzlj.livejournal.com
ragel позволяет

Date: 2009-12-01 05:33 pm (UTC)
From: (Anonymous)
«не exploitable»

зависит от коллбэка. парсер думает, что проверяет, что header field состоит из законных символов (буквы, цифры, минус), но при этом пропускает символы <0. если коллбэк понадеется на эту проверку и со своей стороны станет индексировать этими символами какие-то свои массивы, может оказаться еще как exploitable.

Date: 2009-12-01 05:33 pm (UTC)
From: [identity profile] s1m.livejournal.com
not a bad piece of code for an 8 bit CPU O.o

Date: 2009-12-01 05:34 pm (UTC)
From: [identity profile] avva.livejournal.com
во-во :-)

Date: 2009-12-01 05:35 pm (UTC)
From: [identity profile] avva.livejournal.com
да, вы совершенно правы, спасибо за уточнение.

Date: 2009-12-01 05:42 pm (UTC)
From: [identity profile] s1m.livejournal.com
it's kinda sad though :/

the guy probably spent quite a bit of time working on that 8 bit HTTP parser...

Date: 2009-12-01 06:08 pm (UTC)
From: [identity profile] itman.livejournal.com
Но главное - почти наверняка выбранная модель общения с клиентом, через колбэки, на практике приведет к большим потерям времени и эффективности.

Так там callbacks встраиваемые.

Date: 2009-12-01 06:13 pm (UTC)
From: [identity profile] tretiy3.livejournal.com
сынженированные
какое страшное слово

Date: 2009-12-01 06:19 pm (UTC)
From: (Anonymous)
а в чём проблема данного кода?

Date: 2009-12-01 06:31 pm (UTC)
From: [identity profile] cema.livejournal.com
В каком смысле встраиваемые? (Последнее слово с третьего раза написал правильно.)

Date: 2009-12-01 06:37 pm (UTC)
From: [identity profile] itman.livejournal.com
пардон, подставляемые (inline).

Date: 2009-12-01 06:39 pm (UTC)
From: [identity profile] lazyreader.livejournal.com
В том, что разумно один раз сравнивать 32-битные слова, а не 4 раза 8-битные.
Page 1 of 3 << [1] [2] [3] >>

December 2025

S M T W T F S
  123 4 56
78 9 10 11 1213
1415 1617181920
21 22 23 24 2526 27
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 29th, 2025 01:11 pm
Powered by Dreamwidth Studios