guid to nginx internals

Denis F. Latypoff denis at gostats.ru
Fri May 4 18:24:41 MSD 2007


Hello Anton,

Friday, May 4, 2007, 8:41:08 PM, you wrote:

> Hello Mykola,

> You wrote on Friday, May 4, 2007, 5:18:26 PM:

MZ>> Начало цитаты:
MZ>>     if (m[1] == 'O') {

MZ>>         if (m[0] == 'P' && m[2] == 'S' && m[3] == 'T') {
MZ>>             r->method = NGX_HTTP_POST;
MZ>>             break;
MZ>>         }

MZ>>         if (m[0] == 'C' && m[2] == 'P' && m[3] == 'Y') {
MZ>>             r->method = NGX_HTTP_COPY;
MZ>>             break;
MZ>>         }
MZ>>     ...
MZ>> That's a man who cares about performance. 
MZ>> Конец цитаты.

MZ>> Я не спец в C, и не читал той дискуссии по strncmp, но по моему
MZ>> проверять 2-й байт, а потом 1-й - не самый оптимальный шаблон доступа к
MZ>> памяти

> С точки зрения скорости доступа к памяти без разницы в каком порядке,
> лишь бы данные были там рядом.

> Если повезет и они выровнены, как нужно то данные за один прием попадут
> в кэш процессора. Не повезет - в два.

> А количество сравнений получается меньше если сначала 2-й байт
> проверить, потом 1-й.


первый мой пост был не правилен.

вот более правильные результаты:

nginx_method.c (добавлен дополнительный if):

int
main (void)
{
    char m[] = "POST";
    if (m[1] == 'O')
        if (m[0] == 'P' && m[2] == 'S' && m[3] == 'T')
            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");
}


--- 0w_method.s 2007-05-04 21:14:09.000000000 +0700
+++ nginx_method.s      2007-05-04 21:19:40.000000000 +0700
@@ -1,4 +1,4 @@
-       .file   "0w_method.c"
+       .file   "nginx_method.c"
        .section        .rodata.str1.1,"aMS", at progbits,1
 .LC0:
        .string "POST"
@@ -12,18 +12,25 @@
        pushl   %ebp
        movl    %esp, %ebp
        subl    $24, %esp
-       andl    $-16, %esp
        movl    .LC0, %edx
+       andl    $-16, %esp
+       movl    %edx, -24(%ebp)
        subl    $16, %esp
        movb    .LC0+4, %al
-       cmpl    $1414745936, %edx
-       movl    %edx, -24(%ebp)
+       cmpb    $79, -23(%ebp)
        movb    %al, -20(%ebp)
-       je      .L4
+       je      .L5
+.L2:
        leave
        ret
        .p2align 2,,3
-.L4:
+.L5:
+       cmpb    $80, -24(%ebp)
+       jne     .L2
+       cmpb    $83, -22(%ebp)
+       jne     .L2
+       cmpb    $84, -21(%ebp)
+       jne     .L2
        subl    $12, %esp
        pushl   $.LC1
        call    puts

компилировал с -O2: у nginx_method на 6 операций больше.

-- 
Best regards,
 Denis                            mailto:denis at gostats.ru






More information about the nginx-ru mailing list