ここでは、データを転送する方法、一度に転送する量、および頻度に基づいて、いくつかの仮定を行う必要があります。
XHR リクエストを行っていると仮定することから始めます。これが、必要なメトリックを確実に測定する唯一の方法だからです。
いくらかというと、一度に何メガバイトも送信していないことを願っています。これにより、応答時間の測定が難しくなります (ネットワークの状態は、大きな要求の存続期間中に変化する可能性があるため)。また、ユーザーが何らかのプロキシの背後にいる場合、特大のリクエストがプロキシによって破棄される可能性があります。1 MB 未満と仮定しましょう。
最後に、データを 5 分ごとに 1 回しか送信しない場合は、処理するパフォーマンス測定データがあまりないことは明らかです。
そうは言っても、各リクエストの合計リクエスト時間を測定し、失敗の数を数えることでこれに取り組みます。何かのようなもの:
var recentResults = [], history = 90000;
function sendData() {
var start = Date.now(); // remember when we started this request
$.post('/some/api', { some: 'data' }, function(r) {
recentResults.push({start:start, end:Date.now() - start}); // record how long it took (ms)
}).fail(function() {
recentResults.push({start:start, end:null}); // record a failure
});
}
setInterval(function() {
var now = Date.now();
if (recentResults.length > 0) while (now - recentResults[0].start > history) {
recentResults.shift(); // prune old data
}
var sum;
for (var i = 0, r; i < recentResults.length; r=recentResults[i++]) {
if (r.end == null) sum += 50000;
else sum += r.end;
}
var movingAverage = sum / recentResults.length;
// use movingAverage to calculate the overall connection quality
}, 1000);
ここで使用した値のいくつかは、主に試行錯誤に基づいて微調整する必要があります。
history
リクエストを移動平均に保持する時間 (ミリ秒単位) です。頻繁にリクエストする場合は、これを断ることができます。1 分間に 1 つのリクエストのみを行っている場合は、それを増やす必要があるかもしれません。
- 完全な失敗を 50 秒の応答時間に相当するものとして任意に割り当てました。障害は、一時的なネットワークの問題 (WiFi 信号の低下など) やサーバー エラー (HTTP 500) など、さまざまな理由で発生する可能性があります。実際のシナリオでのテストに基づいて、これを調整することができます。
- 応答時間データを毎秒サンプリングしています。信号メーターの応答性を高めるために、これをより頻繁に行うことができますが、これを行うには明らかにより多くの CPU サイクルが消費されます。アプリをモバイル デバイスで実行する場合は、十分に注意してください。
「良い」平均応答時間と「悪い」平均応答時間がどのように見えるかを判断するには、実際のテストを行う必要があります。