1

私のバルブでは、次のような 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;
...
}

この方法で取得した時間は、サーバー側の実行時間だけでなく、ネットワーク時間も提供してくれると思いますか? 出来ますか ?

(リクエストを行うクライアントによっては、測定された平均時間が1つのIPから同じではないため、平均時間は70ミリ秒で、別のIPは270ミリ秒です)

Filter にまったく同じコードを書きました。

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

、しかし、私のテストでは、バルブとフィルターの実行時間は同じです...

サーブレットのみの実行時間を取得することにもっと興味があります。しかし、最後のバイトが送信された時間も取得できれば、興味があります。

バルブとフィルターで何ができるかを明確にしてくれてありがとう。

4

1 に答える 1

3

この方法で取得した時間は、サーバー側の実行時間だけでなく、ネットワーク時間も提供してくれると思いますか? 出来ますか ?

そのとおりです。少なくとも、要求本文の転送に関連するネットワーク時間の一部は、このように合計時間に含まれます。リクエストヘッダーが完全に読み取られて解析されると、バルブ/フィルター/サーブレットコードが直接呼び出されます。要求本文は、その時点で完全に読み取られるとは限りません。リクエストの本文には、クライアントがリクエストの一部としてネットワーク経由で送信するもの (送信されたフォーム データなど) が含まれます。フィルタ/サーブレットが 、 、 などによって完全なリクエスト ボディの読み取りと解析を開始した場合にのみ、リクエスト ボディ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()ているため、使用したことに注意してください)

于 2011-09-12T16:25:30.677 に答える