Как измерить время выполнения запроса без времени передачи по сети? - PullRequest
1 голос
/ 12 сентября 2011

В моем клапане я получаю время выполнения моего http-запроса следующим образом:

public void invoke(Request request, Response response) 
throws IOException, ServletException {
long t1 = System.currentTimeMillis();
getNext().invoke(request, response);
long t2 = System.currentTimeMillis();
long time = t2 - t1;
...
}

Я подозреваю, что время, которое я получу таким образом, даст мне не только время выполнения на стороне сервера, но и сетьвремя?Возможно ли это?

(потому что в зависимости от клиента, выполняющего запрос, среднее время измерения не одинаково для одного ip, у меня среднее время 70 мс, а для другого ip 270 мс)

Я написалточно такой же код в фильтре:

long before = System.currentTimeMillis();
chain.doFilter(request, response);
long after = System.currentTimeMillis();

, но в моем тесте время выполнения в Valve и в фильтре одинаковое ...

Меня больше интересует получениевремя выполнения только моего сервлета.Но если бы я мог также узнать время отправки последнего байта, мне было бы интересно.

Большое спасибо за разъяснение, что можно узнать с помощью клапанов и фильтров.

1 Ответ

3 голосов
/ 12 сентября 2011

Я подозреваю, что время, которое я получу таким образом, не только даст мне время выполнения на стороне сервера, но также и время сети? Возможно ли это?

Это верно. По крайней мере, часть сетевого времени, включающего передачу тела запроса, включается в общее время таким образом. Код клапана / фильтра / сервлета вызывается непосредственно после того, как запрос заголовки полностью прочитан и проанализирован. Запрос body не обязательно полностью прочитан в этот момент. Тело запроса содержит все, что клиент отправляет по сети как часть запроса (например, отправленные данные формы). Только когда фильтр / сервлет начинает читать и анализировать полное тело запроса, например, getParameter(), getReader(), getInputStream() и т. Д., Тогда все байты тела запроса будут фактически переданы.

Возможно, вы захотите переписать измерение времени выполнения таким образом, чтобы оно начиналось только после того, как тело запроса было полностью прочитано. Это означает, что вы действительно должны измерить его прямо внутри сервлета.

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // Read the request body.
    String foo = request.getParameter("foo");
    String bar = request.getParameter("bar");
    // ...

    // Now, start the stopwatch.
    long startTime = System.nanoTime();

    // Now, do the business job.
    someService.process(foo, bar, ...);
    // ...

    // Now, stop the stopwatch.
    long elapsedTime = System.nanoTime() - startTime;

    // I don't think that you want to include JSP rendering in total time, right?
    request.getRequestDispatcher("/WEB-INF/some.jsp").forward(request, response);
}

(обратите внимание, что я использовал System#nanoTime(), поскольку он имеет гораздо лучшую точность)

...