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