Вопрос производительности фильтров Java - PullRequest
5 голосов
/ 22 июля 2010

У меня два вопроса.Во-первых, фильтры добавляют много накладных расходов к запросу.У нас есть фильтр, и он настроен на работу с шаблоном URL / *.Это означает, что он также работает на всех запросах изображений.Я думаю, что это не очень хорошо для производительности, но мои коллеги считают, что не имеет значения, запускается ли фильтр 5 или 6 раз на запрос, потому что фильтр имеет только пару операторов if.

Isесть способ запустить фильтр один раз для каждого запроса, игнорируя запрос изображения.

Спасибо, Дуг

Ответы [ 3 ]

4 голосов
/ 22 июля 2010

Измерение - это знание. Если хорошо написано, я бы сказал, это незначительно. Но если он, например, захватывает сеанс независимо от того, был ли он создан (и, таким образом, есть вероятность, что он будет создан излишне), то это может оказать заметное влияние на производительность и / или использование памяти, поскольку создание сеансов не разрешено. Само по себе и сеансы хранятся в памяти сервера дольше, чем запросы.

Вы можете заменить url-pattern из /* на *.jsp или переместить ограниченные страницы в определенную папку, например, /secured, /private, /pages и т. Д. И измените url-pattern соответственно на /secured/*, /private/*, /pages/* и т. Д. И поместите весь статический контент в другое место, например, /static. Таким образом, фильтр больше не будет вызываться для статического содержимого.

1 голос
/ 23 июля 2010

Во-первых, я согласен с подходом Profile-first.

Во-вторых, насколько мне известно, веб-сервер использует ту же технику для вызова определенного сервлета (/ JSP), что и дляфильтры.

В случае, если фильтр фильтрует статический ресурс (например, файл jpg), это пустая трата. Если фильтр фильтрует динамический ресурс (например, сервлет), это незначительно .. (Большинство извеб-фреймворки Java, такие как Struts и Jboss-Seam, активно используют фильтры ..)

0 голосов
/ 22 июля 2010

Практически никогда не полезно размышлять о влиянии кода на производительность без предварительного его профилирования . Если код, предлагаемый в фильтрах, не выполняет некоторые операции, о которых вы знаете, что они медленны, то сначала выполняйте измерения перед оптимизацией.

Помните, хотя, когда вы пишете сервлет, может показаться, что единственное, что происходит, - это код в ваших doGet() или doPost() методах , много других вещей происходит до того, как ваш код сервлета / фильтра будет прибег . Контейнер сервлета обрабатывает HTTP-запрос, объединяет его в объекты Java и выполняет все виды другой обработки, прежде чем он передается вашему коду.

Если ваши фильтры сервлетов на самом деле представляют собой лишь пару операторов if, работающих с данными, которые дешево получить (например, сам запрос), маловероятно, что это станет для вас проблемой.

...