1

私のアプリケーションのデータ視覚化リクエストでは、データをチャンクで取得するために複数の AJAX リクエストをサーブレットに送信しています。各リクエストのコールバックで、受信したデータがマップ上にレンダリングされます。

このリクエストのために、私は計算しようとしています:

  • リクエスト時間 (クライアントがサーバーからデータを取得するのにかかった合計時間)
  • 処理時間 (クライアントがクライアント側でデータをレンダリングするのにかかった合計時間)

これを行うために、サーバーに送信する前に各リクエストの開始時間をキャプチャしています(jquery「beforeSend」を使用)、各リクエストの「onSuccess」イベント、終了時間がキャプチャされます。

すべてのリクエストが完了したら、クライアントがサーバーからレコードをフェッチするのにかかった合計時間を計算するために、最後のリクエストの「終了時間」から最初のリクエストの「開始時間」を差し引きます。(処理時間も同様)

しかし、どういうわけか私の計算では正しい結果が得られません。この問題に関する提案を教えてください。

私の質問をより良い方法で説明するために:

var dataProviderRequestsStartTime = [];
var dataProviderRequestsEndTime = [];

var dataParsingStartTime = [];
var dataParsingEndTime = [];

getResults(ids);

var getResults = function(totalIds) {
        for(var i=0; i<10; i++;) {
       requestResultForOneChunk(totalIds[i]);
        }
};

var requestResultForOneChunk = function(streetIds) {
    $.ajax({
        beforeSend: function() {
            var requestStartTime = new Date().getTime();
            dataProviderRequestsStartTime.push(requestStartTime);
        },
        type : 'POST',
        url : "myServlet",
        contentType : "application/x-www-form-urlencoded",
        data : {
            "ids" : streetIds,
        },
        success : function(response) {
            //Request Finished
            var dataProvideRequestEndTime = new Date().getTime();
            dataProviderRequestsEndTime.push(dataProvideRequestEndTime);

            addFeaturesToMap(response);
        },
        error : function(x, e) {
            alert("Something went wrong in the request" + e);
        }
    });
};

var addFeaturesToMap = function(measurements) {
    //Parsing Started
    var featureParsingStartTime = new Date().getTime();
    dataParsingStartTime.push(featureParsingStartTime);

    doParsing(measurements);

    //Parsing Finished
    featureParsingEndTime = new Date().getTime();
    dataParsingEndTime.push(featureParsingEndTime);
};

$("#loading").bind(
        "ajaxStart",
            function(options) {
                ajaxStartTime = options.timeStamp;
            }).bind("ajaxStop", function(options) {
        var ajaxEndTime = options.timeStamp;
        var totalTime = (ajaxEndTime - ajaxStartTime);
        calculateTimeBreakDown();
});

var calculateTimeBreakDown = function() {
    var totalValues = dataProviderRequestsEndTime.length;
    var lastValueIndex = totalValues - 1;

    // Request Time calculation
    var endTimeOfLastRequest = dataProviderRequestsEndTime[lastValueIndex];
    var startTimeOfFirstRequest = dataProviderRequestsStartTime[0];
    var totalRequestTime = (endTimeOfLastRequest - startTimeOfFirstRequest);

    // Parsing Time Calculation
    var endTimeOfLastParsing = dataParsingEndTime[lastValueIndex];
    var startTimeOfFirstParsing = dataParsingStartTime[0];
    var totalParsingTime = (endTimeOfLastParsing - startTimeOfFirstParsing);
};

最後に、requestTime(totalRequestTime) と parsingTime(totalParsingTime) があります。しかし、問題は、これらの両方を追加しても、ajax の開始と停止を使用して計算される合計時間に近い値を生成しないことです。

4

2 に答える 2

1

「合計時間」のイベント.ajaxStart()とイベントを見てください(<-これらはプログレスバーにも最適です).ajaxStop()

http://api.jquery.com/ajaxStart/

http://api.jquery.com/ajaxStop/

および「累積時間」計算用のイベント.ajaxSend().ajaxComplete()

http://api.jquery.com/ajaxSend/

http://api.jquery.com/ajaxComplete/

このコードを見てください:

var totalTime = null;
var cachedTime = null;

function alertLoadingTime() {
    if(!totalTime) return;
    var loadingTime = totalTime / 1000;
    console.log("loaded " + loadingTime + " seconds");
}

function timingStart() {
    cachedTime = new Date;
}

function timingEnd() {
    var endTime = new Date;
    totalTime += endTime - cachedTime;
    cachedTime = null;
    alertLoadingTime();
}

$(document).ajaxStart(timingStart);

$(document).ajaxStop(timingEnd);

ajax 呼び出しに費やされた時間のみが考慮され、最初のページの読み込み時間は含まれないことに注意してください。

解析の時間を計る:

  1. 以前と同じ機能を使用しますが、に変更totalTimetotalParsingTimeます。(注:totalTime他の変数を参照するように変更することでこれを実現できます)
  2. timingStart()ajax 呼び出しの結果を dom ツリーに追加する直前に呼び出します。
  3. サーバーtimingEnd()にすべての応答の最後に追加してもらいます。

totalTimeDOM ツリーにすべてを追加するのにかかった時間に設定されます。

于 2012-09-14T01:51:25.727 に答える