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