Игорь, у меня есть такое пожелание: нельзя ли сделать какую-нибудь
специальную конструкцию для проверки расширения в location. Задача
подобна этой:
location ~ \.(gif|jpg|jpeg|png|ico|txt|zip|dll)$ {
}
довольно частая ситуация, а решать её приходится регулярными
выражениями, что не является, наверное, оптимальным по
производительности.
Я не думаю, что будет существенный выигрыш. Мне была интересна
разница в производительности между регулярным выражением и strncmp
на некоторых простых примерах.
Миллион итераций скомпилированного выражения
"^/users/(.+?)/"
на строке "/users/ulala/test" у меня выполялись 700ms.
Нижеприведённый код - 25ms:
if (strncmp(line, "/users/", 7) == 0) {
for (n = 7; n < len; n++) {
if (line[n] == '/') {
break;
}
}
}
Замена strncmp() на strncasecmp() - 100ms.
Я не думаю, что ручной перебор кучи расширений будет существенно быстрее,
чем регулярное выражение. Кроме того, нужно иметь ввиду, что результаты
микробенчамарков обычно расходятся с жизнью, потому что в повторяющихся
итерациях существенную роль играет кэш.
Игорь Сысоев
http://sysoev.ru