Bienvenue à Blogs CodeS-SourceS Identification | Inscription | Aide

Atteint de JavaScriptite Aiguë [Cyril Durand]

Expert ASP.net Ajax et WCF, Cyril Durand parle dans son blog de point techniques sur ASP.net, ASP.net Ajax, JavaScript, WCF et .net en général. Cyril est également consultant indépendant, n'hésitez pas à le contacter pour de l'assistance sur vos projets

Actualités

  • Blog de Cyril DURAND, passionné de JavaScript, Ajax, ASP.net et tout ce qui touche au developpement Web Client-Side.

    N'hésitez pas à me contacter pour vos projets .net : architecture, accompagnement, formation, ...

    View Cyril Durand's profile on LinkedIn
    hit counters


    Expertise Commerce server et BizTalk

Nombre maximum de requete XMLHTTPRequest (Ajax) simultanees

Dans nos applications web on utilise de plus en plus souvent des requêtes XMLHTTPRequest, aussi appelé requête AJAX avant que ce terme ne soit utilisé pour tout et n'importe quoi. Vous savez surement que l'objet XMLHTTPRequest permet de faire des requêtes HTTP en mode asynchrone, c'est à dire qu'on peut lancer une requête sans attendre de réponse. Aujourd'hui j'ai voulu regarder le nombre maximum de requêtes asynchrones simultanées qu'un navigateur peut faire.

Voici le code que j'ai utilisé :

var XHR = function(duration){ this._xhr_object = window.XMLHttpRequest? new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"); this._id = XHR.ID++; this._xhr_object.open('GET', 'wait.aspx?duration=' + duration + '&nocache=' + (new Date()).getTime(), true); var self = this; this._xhr_object.onreadystatechange = function() { if(self._xhr_object.readyState == 4){ debug.trace('fin ' + self._id + ' ' + (new Date() - self._start)); } } this._xhr_object.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); this._start = new Date(); this._xhr_object.send(null); debug.trace('debut ' + this._id); } XHR.ID = 0; window.onload = function(){ for (var i = 0; i < 12; i++){ new XHR(2000); } }

Ce code lance 12 requêtes vers une page qui prend 2000 ms à s'exécuter, lorsque les réponses arrivent j'affiche la durée entre le moment où l'on appelle la méthode send de l'objet XMLHTTPRequest et le moment où la réponse arrive.

Voici les résultats obtenus :

Internet Explorer 7 :

14:15:21.919 - debut 0
14:15:21.921 - debut 1
14:15:21.922 - debut 2
14:15:21.923 - debut 3
14:15:21.924 - debut 4
14:15:21.925 - debut 5
14:15:21.926 - debut 6
14:15:21.927 - debut 7
14:15:21.929 - debut 8
14:15:21.931 - debut 9
14:15:21.932 - debut 10
14:15:21.934 - debut 11
14:15:23.960 - fin 0 2041
14:15:23.972 - fin 1 2052
14:15:26.13 - fin 2 4092
14:15:26.23 - fin 3 4100
14:15:28.34 - fin 4 6111
14:15:28.47 - fin 5 6122
14:15:30.47 - fin 6 8121
14:15:30.81 - fin 7 8154
14:15:32.105 - fin 8 10176
14:15:32.116 - fin 9 10186
14:15:34.163 - fin 10 12231
14:15:34.175 - fin 11 12241

FireFox 2 :

14:16:32.703 - debut 0
14:16:32.706 - debut 1
14:16:32.707 - debut 2
14:16:32.708 - debut 3
14:16:32.710 - debut 4
14:16:32.711 - debut 5
14:16:32.712 - debut 6
14:16:32.714 - debut 7
14:16:32.715 - debut 8
14:16:32.718 - debut 9
14:16:32.719 - debut 10
14:16:32.721 - debut 11
14:16:34.711 - fin 0 2008
14:16:34.720 - fin 1 2015
14:16:36.770 - fin 2 4063
14:16:36.776 - fin 3 4068
14:16:38.834 - fin 5 6123
14:16:38.844 - fin 4 6135
14:16:40.849 - fin 6 8137
14:16:40.858 - fin 7 8144
14:16:42.841 - fin 9 10124
14:16:42.852 - fin 8 10137
14:16:44.859 - fin 10 12140
14:16:44.867 - fin 11 12147

Opera :

14:21:9.902 - debut 0
14:21:9.904 - debut 1
14:21:9.905 - debut 2
14:21:9.906 - debut 3
14:21:9.908 - debut 4
14:21:9.909 - debut 5
14:21:9.910 - debut 6
14:21:9.912 - debut 7
14:21:9.913 - debut 8
14:21:9.916 - debut 9
14:21:9.924 - debut 10
14:21:9.926 - debut 11
14:21:11.907 - fin 0 2006
14:21:11.908 - fin 1 2005
14:21:11.919 - fin 2 2015
14:21:11.920 - fin 3 2015
14:21:13.907 - fin 4 4000
14:21:13.918 - fin 5 4010
14:21:13.919 - fin 6 4009
14:21:13.928 - fin 7 4017
14:21:15.910 - fin 9 5995
14:21:15.912 - fin 8 6000
14:21:15.923 - fin 10 6000
14:21:15.925 - fin 11 6000

Conclusion de ce test :

On voit que IE7 et FF2 ont à peu près le même comportement, ils peuvent exécuter 2 requêtes XMLHTTPRequest en même temps, par contre Opera exécute 4 requêtes en même temps. 

 


Pour info voici le code de la fonction debug.trace :

var debug = { traceElmt : null, trace : function(text){ if (!debug.traceElmt) debug.traceElmt = document.getElementById('log'); var d = new Date(); debug.traceElmt.value += d.getHours() + ':' + d.getMinutes() + ':' + d.getSeconds() + '.' + d.getMilliseconds() + ' - ' + text + '\r'; debug.traceElmt.scrollTop = debug.traceElmt.scrollHeight; } }

et de la page wait.aspx qui prend un certain temps à s'exécuter :

<%@ Page Language="C#" AutoEventWireup="true" %> <script runat="server" type="text/C#"> void Page_Load(object sender, EventArgs e) { int duration = 1000; int.TryParse(Request.QueryString["duration"], out duration); System.Threading.Thread.Sleep(duration); } </script>
Posted: dimanche 25 février 2007 14:42 par cyril
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :

Commentaires

badrbadr a dit :

Sur certains de mes programmes .net, j'avais remarqué que je ne pouvais pas télécharger plus de 2 fichiers simultanément (async). J'ai donc cru qu'il y avait une limite qque part mais j'ai pas eu le temps de fouiller le problème.

# février 25, 2007 18:59

FREMYCOMPANY a dit :

Intéressant... Etonnant quand on sait que FIDDLER détecte un grand nombre de connection simultanée pour le téléchargement de CSS, JS, IMAGES, ...

Je me permets donc la question suivante, même si je me doute un peu de la réponse, ne doutant plus de la qualité de tes travaux : le test était-il réalisé sur une page ne contenant que le test ou il y avait du CSS, ... ?

Et si on lance le même test mais 15 seccondes après onload ?

D'un autre coté, c'est peut-être une limitation dans MSXML...

Autre question, et si on tente d'instancer des MSXML de versions différentes ?

"MSXML2.XMLHTTPREQUEST" puis "MXSML2.XMLHTTPREQUEST.4.0", 5.0 et 6.0 ? La limitation est-elle toujours de 2 ?

# février 25, 2007 20:54

cyril a dit :

Mes tests sont bien sur effectué sans rien d'autres dedans : avec une page vierge ! Le serveur est différent du client ...  J'ai aussi tester bien après le window.onload et le fonctionnement est identique.

En ce qui concerne d'instancier différentes version de msxml, c'est quoi l'interet ?

# février 25, 2007 21:27

FREMYCOMPANY a dit :

De voir si en diversifiant les composants on ne s'octroie pas 2 requêtes par version composant ;)

Mais bon c'est un peu rêver je crois, mais qui sait...

# mars 5, 2007 20:07

FREMYCOMPANY a dit :

Et une autre question. Et si on réalise un "faux" xhr ?

Je m'explique, si on crée une iframe invisible avec un src dynamique et qu'on envoie un formulaire dynamiquement créé en fonction des arguments passés en post et qu'on s'abonne à onload de cette nouvelle iframe, y a-t-il toujours une limitation à 2 ?

# mars 5, 2007 20:13

FREMYCOMPANY a dit :

Taum a dit () :

J'ai essayé ce test sur Firefox et en réalité, cela dépend de l'option network.http.max-persistent-connections-per-server (modifiable par about:config). La valeur par défaut est à 2 et j'ai effectivement le même résultat que dis dans l'article ; en revanche si je passe cet option a 4 les requêtes se font 4 par 4 etc... à noter que le nombre de connexions est également affecté par network.http.max-connections-per-server (défaut 8) network.http.max-connections (défaut 24). J'imagine qu'il y a surement quelque chose du même genre pour les autres navigateurs.

# mars 9, 2007 20:20

smo a dit :

Pour information c'est dû tout simplement à la RFC2616 définissant HTTP (http://www.faqs.org/rfcs/rfc2616.html): "Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy. A proxy SHOULD use up to 2*N connections to another server or proxy, where N is the number of simultaneously active users. These guidelines are intended to improve HTTP response times and avoid congestion."

Ce paramètre peut se changer sur IE (chercher sur MaxConnectionsPer1_0Server et MaxConnectionsPerServer dans google).

Il peut s'avérer intéressant de les modifiers si on développer une appli Ajax dont on maîtrise la configuration des postes clients pour accélérer certains traitements, mais attention, ça peut poser des problèmes de congestions coté serveur...

# avril 23, 2007 00:13
Les commentaires anonymes sont désactivés

Les 10 derniers blogs postés

- Merci par Blog de Jérémy Jeanson le 10-01-2019, 20:47

- Office 365: Script PowerShell pour auditer l’usage des Office Groups de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 11:02

- Office 365: Script PowerShell pour auditer l’usage de Microsoft Teams de votre tenant par Blog Technique de Romelard Fabrice le 04-26-2019, 10:39

- Office 365: Script PowerShell pour auditer l’usage de OneDrive for Business de votre tenant par Blog Technique de Romelard Fabrice le 04-25-2019, 15:13

- Office 365: Script PowerShell pour auditer l’usage de SharePoint Online de votre tenant par Blog Technique de Romelard Fabrice le 02-27-2019, 13:39

- Office 365: Script PowerShell pour auditer l’usage d’Exchange Online de votre tenant par Blog Technique de Romelard Fabrice le 02-25-2019, 15:07

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Stream Portal par Blog Technique de Romelard Fabrice le 02-21-2019, 17:56

- Office 365: Script PowerShell pour auditer le contenu de son Office 365 Video Portal par Blog Technique de Romelard Fabrice le 02-18-2019, 18:56

- Office 365: Script PowerShell pour extraire les Audit Log basés sur des filtres fournis par Blog Technique de Romelard Fabrice le 01-28-2019, 16:13

- SharePoint Online: Script PowerShell pour désactiver l’Option IRM des sites SPO non autorisés par Blog Technique de Romelard Fabrice le 12-14-2018, 13:01