Istnieje kilka założeń do zrobienia w oparciu o sposób przesyłania danych, ilości za jednym razem i częstotliwości.
Zacznę od założenia, że wykonujesz żądania XHR, ponieważ jest to naprawdę jedyny sposób na niezawodny pomiar wymaganych danych.
O ile, mam nadzieję, że nie wysyłasz megabajtów na raz. To sprawia, że trudniej jest zmierzyć czas odpowiedzi (ponieważ warunki sieci mogą się zmieniać w czasie trwania dużego żądania). Ponadto, jeśli użytkownik znajduje się za jakimś proxy, nadmierne żądania mogą zostać odrzucone przez serwer proxy. Przyjmijmy mniej niż 1 MB.
Wreszcie, jeśli przesyłasz dane tylko raz na 5 minut, oczywiście nie będziemy dysponować dużymi danymi pomiarowymi wydajności.
Powiedziawszy to, podchodzę do tego, mierząc całkowity czas żądania dla każdego żądania i licząc liczbę błędów. Coś jak:
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);
Będziesz musiał poprawić niektóre z wartości, których użyłem tutaj, głównie na podstawie prób i błędów.
history
to czas (w milisekundach) do utrzymania żądań w średniej ruchomej. Jeśli wysyłasz częste prośby, możesz to wyłączyć. Jeśli wykonujesz tylko jedną prośbę na minutę, być może musisz ją zwiększyć.
- Dowolnie przypisałem całkowitą porażkę jako równoważną 50-sekundowemu czasowi reakcji. Awarie mogą się zdarzyć z wielu powodów, w tym przejściowych problemów z siecią (takich jak słaby sygnał WiFi) i błędów serwera (HTTP 500). Możesz to zmienić w oparciu o testy w rzeczywistych scenariuszach.
- Próbkuję dane czasu odpowiedzi co sekundę.Możesz zrobić to częściej, aby uzyskać bardziej elastyczny miernik sygnału, ale oczywiście będziesz potrzebował więcej cykli procesora, aby to zrobić. Jeśli Twoja aplikacja działa na urządzeniach mobilnych, zachowaj ostrożność.
Będziesz musiał przeprowadzić testy w świecie rzeczywistym, aby określić, jak wygląda średni "dobry" lub "zły" średni czas reakcji.
Myślę, że to zależy od rodzaju interfejsu sieciowego, którego używa klient. Jeśli jest to połączenie fizyczne, nie masz szczęścia, chyba że możesz dowiedzieć się, jak ustalić, ile pakietów jest upuszczanych między klientem a serwerem. Jeśli jest to połączenie bezprzewodowe, zależy to od tego, czy karta sieciowa klienta ma publiczny interfejs API do uzyskiwania wskaźników siły sygnału. – CodeBlind
chociaż jestem zainteresowany tym pytaniem w ogólności - sądzę, że osobiście nie szukałbyś jakiejś niewyraźnej oceny jakości, ale raczej jak wykrywać i usuwać awarie spowodowane awarią sieci. Nie rozumiem, w jaki sposób "ocena" pomogłaby ci, poza widocznym przekonaniem użytkownika, że awaria oprogramowania jest ich winą, a nie twoją. nawet wtedy świetna "ocena 100%" może mieć blip, który powoduje awarię ... – goat
o tak, absolutnie. pracujemy nad poprawą tego doświadczenia i mechanizmów odzyskiwania. ale tym, co chcemy wskazać z góry użytkownikowi, jest to, że oczekuje się usterki. Zastanów się, jak często patrzysz na pasek n/w telefonu, aby sprawdzić, czy jest to przyczyna Twojej rozmowy/łamania głosu podczas mówienia! – Saket