Блог Конфуция
Быстрый ответ 15.12.2008

UPD 2011-04-08: Внимание! Эта статья хоть и стара, но еще очень даже ничего..

Если генерировать ответ постепенно, не зная заранее его размер, то нжинкс попытается отдать его клиенту чанками. Если клиент не поддерживает HTTP/1.1, то нжинкс откажется от кипэлайва. Это совсем не здорово, так как после отправки придется разорвать соединение и устанавливать новое.

Конечно, яваскрипт может перед отправкой заголовков сложить все данные в одну строку, вычислить длину строки и передать ответ. Проблема заключается в том, что string.length вернет именно длину строки, а не количество байт в ней. Чтобы узнать длину той строки, которую нжинкс будет реально передавать, надо сначала попросить SpiderMonkey сконвертировать внутреннюю строку (UTF-16) в обычную (ASCII, UTF-8), а затем уже вычислить ее длину. К этой работе добавляется манипуляция заголовками из яваскрипта. Это еще один вызов метода и несколько проверок входных/выходных параметров.

Все эти действия будут лишними, если единственная цель вычисления длины строки — это отправка заголовка Content-length. Разумно будет завернуть все необходимые действия в один нативный метод и передать ему только строку с данными. В таком случае мы экономим немного времени, что полезно, если результат запроса уже закеширован в какой-либо переменной, и его надо очень быстро отправить.

Вот пример яваскрипта:


function processRequest (r)
{
	r.sendString("Привет, Девелопер!")
	return Nginx.OK
}
Эта функция умеет отдавать строку «Привет, Девелопер!» 15 000 раз в секунду. Без кипэлайва будет всего около 6000. Если попытаться еще немного соптимизировать, можно кешировать и ascii-строку и ее длину между обращениями к sendString(). Строки в яваскрипте изменять нельзя, поэтому такое кеширование легко реализовать. Для длинных строк это может быть очень полезно.

Теги:
  • сервер
  • benchmark
  • javascript
  • keep-alive
  • nginx
Очень жду ваших комментариев на почту или на гитхаб.