guid to nginx internals
Alexey Mahotkin
squadette at gmail.com
Fri May 4 18:22:50 MSD 2007
> во втором методе (0W_method) на одну операцию больше :))
Это потому, что он делает всё правильно :)
А первый метод проверяет только единственный символ.
On 5/4/07, Denis F. Latypoff <denis at gostats.ru> wrote:
> Hello Mykola,
>
> Friday, May 4, 2007, 8:18:26 PM, you 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-й - не самый оптимальный шаблон доступа к
> > памяти
>
> > Мне кажется что лучше проверять так, хотя могу и ошибаться:
>
> > #define STR4_GET 0x00544547
> > #define STR4_POST 0x54534f50
>
> > uint32_t tmp4;
>
> > tmp4 = *(uint32_t*)m;
> > 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;
> > ..........
> > }
>
> Есть две программы
>
> nginx_method.c:
>
> int
> main (void)
> {
> char m[] = "POST";
> if (m[1] == 'O')
> printf ("OK\n");
> }
>
>
>
> 0W_method.c:
>
> #define STR4_POST 0x54534f50
>
> int
> main (void)
> {
> char m[] = "POST";
> unsigned int tmp4 = *(unsigned int *) m;
>
> if (tmp4 == STR4_POST)
> printf ("OK\n");
> }
>
> gcc -O2 -save-temps nginx_method.c
> gcc -O2 -save-temps 0W_method.c
>
> --- nginx_method.s 2007-05-04 21:12:19.000000000 +0700
> +++ 0w_method.s 2007-05-04 21:12:25.000000000 +0700
> @@ -1,4 +1,4 @@
> - .file "nginx_method.c"
> + .file "0w_method.c"
> .section .rodata.str1.1,"aMS", at progbits,1
> .LC0:
> .string "POST"
> @@ -12,12 +12,12 @@
> pushl %ebp
> movl %esp, %ebp
> subl $24, %esp
> - movl .LC0, %eax
> andl $-16, %esp
> - movl %eax, -24(%ebp)
> + movl .LC0, %edx
> subl $16, %esp
> movb .LC0+4, %al
> - cmpb $79, -23(%ebp)
> + cmpl $1414745936, %edx
> + movl %edx, -24(%ebp)
> movb %al, -20(%ebp)
> je .L4
> leave
>
> тоже самое при -O3.
>
> > On Mon, 30 Apr 2007 16:02:02 +0400
> > Igor Sysoev <is at rambler-co.ru> wrote:
>
> >> Отличное на мой взгляд описание внутреннего устройства:
> >> http://www.riceonfire.org/emiller/nginx-modules-guide.html
> >>
> >>
> >> --
> >> Igor Sysoev
> >> http://sysoev.ru/en/
> >>
>
>
>
>
> --
> Best regards,
> Denis mailto:denis at gostats.ru
>
>
>
More information about the nginx-ru
mailing list