Questo sarà più un dolore che si potrebbe pensare.
Il tuo primo problema è che Javascript non ha ping. Principalmente ciò che Javascript è buono è HTTP e alcuni protocolli di cugino.
Il secondo problema è che non è possibile emettere alcune richieste di ajax e cronometrare i risultati (sarebbe troppo ovvio). Lo same origin policy ti impedirà di usare ajax per parlare con server diversi da quello da cui proviene la pagina. Avrai bisogno di usare JSONP, o cambiare l'src di un tag immagine, o qualcos'altro più indiretto.
Il terzo problema è che non si desidera eseguire operazioni che comportino la restituzione di molti dati. Non si desidera che il tempo di trasferimento dei dati o l'elaborazione estesa del server interferiscano con la misurazione della latenza.
In quarto luogo, non è possibile chiedere URL che potrebbero essere memorizzati nella cache. Se l'oggetto si trovasse nella cache, otterresti misurazioni di "latenza" molto basse, ma non sarebbe significativo.
La mia soluzione era utilizzare un tag immagine senza attributo src
. Al caricamento del documento, impostare src
in modo che punti a un server valido ma utilizzare una porta non valida. In genere, è più veloce per un server rifiutare semplicemente la connessione piuttosto che generare una risposta di errore 404 corretta. Tutto quello che devi fare è misurare quanto tempo ci vuole per ottenere l'evento di errore dall'immagine.
Da The Filddle:
var start = new Date().getTime();
$('#junkOne').attr('src', 'http://fate.holmes-cj.com:8886/').error(function() {
var end = new Date().getTime();
$('#timer').html("" + (end - start) + "ms");
});
La tecnica potrebbe probabilmente essere migliorato. Ecco alcune idee:
- Utilizzare l'indirizzo IP anziché il nome host DNS.
- Fare il "ping" più volte, eliminare i punteggi più alti e più bassi, quindi calcolare la media del resto.
- Se la tua pagina web ha un'elaborazione molto pesante, prova a fare i test quando pensi che il caricamento dell'interfaccia utente sia più leggero.
Solo una nota che questo approccio incontrerà ulteriore latenza se è richiesta una ricerca DNS (non è sicuro se la domanda dovrebbe includere il tempo di ricerca DNS come parte della latenza, se applicabile). – kendaleiv
L'ho provato ma i dati sono troppo casuali. Ho aggiunto una demo che puoi effettuare il checkout – Jim
Il tuo fiddle finisce con il caching del file js, dovresti fare qualcosa del genere per evitare il caching: http://jsfiddle.net/dLVG6/1/ – olsn