ПРОЕКТЫ 


  АРХИВ 


Apache-Talk @lexa.ru 

Inet-Admins @info.east.ru 

Filmscanners @halftone.co.uk 

Security-alerts @yandex-team.ru 

nginx-ru @sysoev.ru 


  СТАТЬИ 


  ПЕРСОНАЛЬНОЕ 


  ПРОГРАММЫ 



ПИШИТЕ
ПИСЬМА












     АРХИВ :: nginx-ru
Nginx-ru mailing list archive (nginx-ru@sysoev.ru)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re[2]: guid to nginx internals



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",@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

во втором методе (0W_method) на одну операцию больше :))
тоже самое при -O3.

> 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/
>> 




-- 
Best regards,
 Denis                            mailto:denis@xxxxxxxxxx




 




Copyright © Lexa Software, 1996-2009.