Frage

In meinem Ventil erhalte ich die Ausführungszeit meiner http-Abfrage wie folgt:

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;
...
}

Ich vermute, dass die Zeit, die ich auf diese Weise erhalte, mir nicht nur die serverseitige Ausführungszeit, sondern auch die Netzwerkzeit gibt?Ist es möglich?

(Da je nach Client, der die Anforderung ausführt, die gemessene Durchschnittszeit von einer IP nicht gleich ist, habe ich eine durchschnittliche Zeit von 70 ms und eine andere IP von 270 ms)

Ich habe genau den gleichen Code in einen Filter geschrieben:

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

, aber in meinem Test ist die Ausführungszeit im Ventil und im Filter gleich ...

Ich bin mehr daran interessiert, nur die Ausführungszeit meines Servlets zu ermitteln. Aber wenn ich auch die Zeit bekommen könnte, zu der das letzte Byte gesendet wird, wäre ich interessiert.

Vielen Dank, um mir zu verdeutlichen, was mit Ventilen und Filtern zu wissen ist.

War es hilfreich?

Lösung

Ich vermute, dass die Zeit, die ich auf diese Weise erhalte, mir nicht nur die serverseitige Ausführungszeit, sondern auch die Netzwerkzeit gibt? Ist es möglich?

Das stimmt. Zumindest ein Teil der Netzwerkzeit, die das Übertragen des Anforderungshauptteils umfasst, wird auf diese Weise in die Gesamtzeit einbezogen. Der Ventil- / Filter- / Servlet-Code wird direkt aufgerufen, sobald die Header der Anforderung vollständig gelesen und analysiert wurden. Die Anforderung body wird zu diesem Zeitpunkt nicht unbedingt vollständig gelesen. Der Anforderungshauptteil enthält alles, was der Client als Teil der Anforderung über das Netzwerk sendet (z. B. übermittelte Formulardaten). Nur wenn der Filter / das Servlet beginnt, den vollständigen Anforderungshauptteil zu lesen und zu analysieren, z. getParameter(), getReader(), getInputStream() usw., dann werden tatsächlich alle Bytes des Anforderungshauptteils übertragen.

Möglicherweise möchten Sie Ihre Ausführungszeitmessung so umschreiben, dass sie erst startet, nachdem der Anforderungshauptteil vollständig gelesen wurde. Dies bedeutet, dass Sie es wirklich direkt im Servlet messen müssen.

@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);
}

(Beachten Sie, dass ich System#nanoTime() verwendet habe, da dieser eine viel bessere Genauigkeit aufweist)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top