SpeedTest

Faites des mesures précises de votre connexion en JavaScript

a marqué ce sujet comme résolu.

Bonjour à tous,

Je viens ici vous présenter un projet que j'ai initié en octobre 2011 et qui est resté abandonné pendant plus de 2 ans. J'ai repris le développement from scratch depuis février dernier et, bien que je n'ai pas beaucoup travaillé dessus entre début mai et fin septembre (je me suis consacré à mes études), je ne compte pas de nouveau abandonner ce projet.

Vous l'aurez compris au titre du sujet, le projet en question s'appelle SpeedTest et permet de mesurer précisément la latence et le débit de votre connexion Internet (les débits obtenus sont proches de ceux obtenus par SpeedTest.net et la latence généralement proche de celle obtenue par un simple ping). Je vous propose d'essayer immédiatement cela sur le site du projet. Le projet est bien évidemment aussi disponible en open source sur Github.

Cependant, quel intérêt ? Pourquoi ne pas passer par le biais de l'incontournable SpeedTest.net ? Tout simplement parce que le but n'est pas le même. Mon projet permet de vérifier le débit et la latence d'une connexion (notamment celles de vos clients) avec un serveur donné, vous pouvez tester une connexion d'un point à un autre et non pas sur une multitude de serveurs prévus spécialement pour ça. Le projet a aussi l'avantage de fonctionner nativement sur mobile !

Comme beaucoup de développeurs, je me suis lancé sur le projet avant tout pour le défi technique. À l'origine, j'étais très clairement le seul à avoir créé une librairie du genre, les autres faisant tous usage du Flash pour effectuer ces mesures. Puis SpeedOf.Me est apparu en décembre 2011 (soit 2 mois après la création de mon projet) apportant une solution viable alors que mon projet n'était, à l'époque, qu'une solution très instable et relativement mal architecturée.

Entre fin 2013 et début 2014, j'ai commencé à voir pas mal de personnes ajouter SpeedTest dans leurs favoris Github alors que le site de démonstration était pourtant très instable. Du coup, j'ai décidé de reprendre le projet sur la bannière d'une V2. Aujourd'hui, cette version a enfin atteint un certain stade de maturité et je me suis donc décidé à présenter le projet ici. :)

Pour les intéressés, l'architecture du projet est détaillée sur Github. Concernant les aspects technologiques, j'ai décidé de tirer parti de l'ensemble de l'API Performance, ce qui explique actuellement la limitation à Chrome (j'ai prévu de quoi palier ce problème mais ce n'est pas encore fonctionnel). Si vous avez envie d'en savoir plus, voici un document que j'avais réalisé lors du prototypage pour garder une trace de la manière dont je devais faire mes calculs pour mesurer la latence de la connexion :

Le calcul du ping se fait en trois étapes :

  • Envoie d'une requête XHR à une adresse normalement inconnue du navigateur (afin d'éviter tout problème de cache). Une URL pointant à la racine du serveur concaténée par le timestamp courant (afin d'éviter tout problème de cache) semble être la meilleure solution.
  • Récupération des mesures avec la méthode window.performance.getEntriesByName(USED_URL)[LAST_ITEM];;
  • Calcul du temps de connexion au serveur (se baser sur cet article), représentant ainsi le temps de latence (en oubliant donc les éléments pertubateurs tels que le fetch DNS et autres choses) :
    • Si la propriété secureConnectionStart est à 0 alors il s'agit d'une connexion HTTP. Le calcul se résume donc à connectEnd - connectStart.
    • Si la propriété secureConnectionStart est différente de 0 alors il s'agit d'une connexion HTTPS. Le calcul de la latence HTTPS se fait avec connectEnd - connectStart et le calcul de la latence HTTP avec secureConnectionStart - connectStart.

Le protocole HTTP du serveur contacté ne doit pas utiliser les connexions persistantes ou bien la connexion TCP ne sera pas renouvelée et le calcul de la latence sera équivalent à 0.

Une chose importante à noter face au site SpeedOf.Me : toutes les données envoyées et réceptionnées sont générées à la volée, évitant ainsi une quelconque nécessiter d'héberger de gros fichiers sur le serveur et permettant aussi de lancer un éventuel upload avant même un download.

Enfin, une fois une première release mise en ligne, je vais m'atteler à un refactoring du projet pour passer d'ES5 à ES6, ce qui permettra d'obtenir un code plus propre grâce aux apports en sucre syntaxe de cette version du langage. Le développement se fera en ES6 et sera transpilé en ES5 par le biais de Traceur Compiler.

Voilà tout, les retours sont les bienvenus ! À noter que j'envisage de changer le nom du projet pour quelque chose de moins lié au service de SpeedTest.net (d'autant plus que le nom est déposé), je pensais à Network.js mais je suis à l'écoute d'autres suggestions. :)

Salut, chez moi, le ping ne fonctionne pas, et pour le download ça ne joue pas du tout.

En détail:

  • Upload

    Speedtest.net: 1.868Mo/s

    Ton speedtest: 1.763Mo/s

  • Download

    Speestest.net: 7.536Mo/s

    Ton speedtest: 0.834Mo/s

  • Ping

    Speedtest.net: 16Ms

    Ton Speedtest: Ne fonctionne pas

On voit donc que l'upload est plutôt correct, mais le download alors pas du tout !

A+

+0 -0

Salut !

L'outil est bien fait, pour les valeurs de up- et down-load, j'ai des retours tout à fait comparables avec ce que j'avais déjà eu avec d'autres tests.

Par contre, pour la latence avec Firefox 35 20141006, je n'ai systématiquement qu'une requête d'envoyée.

J'ai testé avec Chrome 40.0.2180.0 canary, il y a bien 5 requêtes qui sont envoyées, et la latence s'affiche.

Il faudrait voir comment Firefox gère les requêtes AJAX, il est possible qu'il évite de les renvoyer si elles sont trop proches et trop similaires.

Je note que dans les deux navigateurs, j'ai le message "At least one latency returned a zero value, this can be due to the configuration of your web server which is probably using persistant connections. Check the documentation to solve this problem."

Avec Internet Explorer 11.0.9600.17280, j'ai une erreur d'interprétation de script dès que je tente de lancer quoi que ce soit

InvalidStateError
Fichier : speedtest.min.js, ligne : 1, colonne : 4463
Fichier : main.js, ligne : 24

+0 -0

Oui sous Firefox la latence merde en permanence, cela vient sûrement du fait que la connexion reste persistante malgré mes réglages, c'est pas facile à solutionner. Le problème existe aussi sur Chrome mais avec plus de parcimonie.

Concernant le message, c'est moi qui le génère mais il apparaît quand il le faut pas, c'est un bug à régler. Et pour Internet Explorer, je travaillerai dessus plus tard, y'a déjà bien d'autres choses à faire avant ça.

Merci pour ton retour :)

J'ai bien précisé qu'actuellement le script ne fonctionnait pas sur les navigateurs autres que Chrome ^^' Concernant ta localisation, cela doit en effet jouer sur le débit, il faut comparer avec un test SpeedTest.net effectué sur un serveur parisien ;)

Sinon un petit point sur le projet : j'ai pas trop eu le temps de bosser dessus ces derniers temps. J'ai réglé le bug qui affichait en permanence un warning concernant des latences à 0 dans la console (maintenant il faut supprimer les latences à 0 :p ) et je suis actuellement en train de bosser sur une méthode abort() pour annuler la mesure en cours. Il reste encore pas mal de choses à faire en plus de ça.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte