guid to nginx internals

Alexey Mahotkin squadette at gmail.com
Fri May 4 18:34:12 MSD 2007


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

Что абсолютно ни о чём на современном процессоре не говорит.

On 5/4/07, Denis F. Latypoff <denis at gostats.ru> wrote:
> 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
>
> --
> Best regards,
>  Denis                            mailto:denis at gostats.ru
>
>
>


More information about the nginx-ru mailing list