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