On Fri, May 04, 2007 at 04:18:26PM +0300, Mykola Zubach wrote:
> Начало цитаты:
> if (m[1] == 'O') {
>
> if (m[0] == 'P' && m[2] == 'S' && m[3] == 'T') {
> r->method = NGX_HTTP_POST;
> break;
> }
>
> if (m[0] == 'C' && m[2] == 'P' && m[3] == 'Y') {
> r->method = NGX_HTTP_COPY;
> break;
> }
> ...
> That's a man who cares about performance.
> Конец цитаты.
>
> Я не спец в C, и не читал той дискуссии по strncmp, но по моему
> проверять 2-й байт, а потом 1-й - не самый оптимальный шаблон доступа к
> памяти
Для современных процессоров, если все данные в одной cache line - без
разницы.
> Мне кажется что лучше проверять так, хотя могу и ошибаться:
>
> #define STR4_GET 0x00544547
> #define STR4_POST 0x54534f50
>
> uint32_t tmp4;
>
> tmp4 = *(uint32_t*)m;
Так проверять, конечно же, лучше, только вот на sparc в этом месте с
большой вероятностью будет SIGBUS. На powerpc, по-моему, тоже, но могу
ошибаться.
> switch(tmp4) {
> // методы следуют в порядке падения популярности, первым разумеется GET
> case STR4_GET:
> r->method = NGX_HTTP_GET;
> break;
> case STR4_POST:
> // if(m[5] == 0) // необязательно, но чтобы исключить
> // неправильный метод как POSTME
> r->method = NGX_HTTP_POST;
> break;
> ..........
> }
>
> On Mon, 30 Apr 2007 16:02:02 +0400
> Igor Sysoev <is@xxxxxxxxxxxxx> wrote:
>
> > Отличное на мой взгляд описание внутреннего устройства:
> > http://www.riceonfire.org/emiller/nginx-modules-guide.html
> >
> >
> > --
> > Igor Sysoev
> > http://sysoev.ru/en/
> >
>
--
Игорь Сысоев
http://sysoev.ru