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