IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

array: for() vs map()


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut array: for() vs map()
    Bonjour

    Depuis peu j'utilise array.map() à la place des boucles for() malgré un avis assez répandu selon lequel cette méthode serait plus lente et donc pas adaptée au 'hot code'.
    Or cet article récent par exemple taille un short à la boucle for...

    Alors voilà, question simple et directe : selon vous peut-on oublier définitivement les for() si par exemple on ne cible que les navigateurs récents ?

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 659
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 659
    Billets dans le blog
    1
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut
    Je connaissais pas le while power, effectivement c'est futé, et le + rapide !


    Sinon for() est x2 + rapide (avec FF) que map().

    Mais il y a 2 autres arguments dans l'article : le scope indépendant (qui évite de s'emmeler les 'i' et autres variables) et l'aspect mémoire :
    It also points out something that you would not notice if merely viewing a for() vs .forEach() test like this. for() uses more memory than .forEach()!

    Alors question très générale : en quoi est ce que l'utilisation de la mémoire est importante face à la vitesse ??
    Est ce que ce choix là peut vraiment influer sur la performance globale, sachant qu'il peut s'intégrer dans du 'hot code' justement et dans des processus qui bouffent déjà pas mal de mémoire... (du three.js en l'occurrence) ?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 19
    Par défaut
    Question épineuse aux multiples réponses.
    C'est pas une question d'utilisation face à la vitesse, les 2 sont intimement lié.
    Faut rester raisonnable, un pc a 8Go de ram, bon tu a de la marge , maintenant un vieux tel a 512Mo , c'est la criticité de départ qui influence tes choix (qu'est se que je veut, sous quelle platforme ...).
    Exemple tu a besoin d'un tableau de 200Mo, plutot que de l'envoyer à une fonction (qui va crée une copie, tu te retrouve avec 400Mo ), exteriorise ta variable pour que les 2 fonctions y ai accès.
    D'ailleurs, a tu réelement besoin de ses 200Mo ? , dès le départ ?

    "Est ce que ce choix là peut vraiment influer sur la performance globale"
    Oui et non, si tu a une empreinte mémoire de 1Mo sur un pc actuel, tu comprend bien que non, maintenant 250Mo sur une tel de 512Mo, bon la ya un énorme problème

    Vitesse et mémoire sont deux choses bien distinct mais qui fonctionne ensemble, l'un impact l'autre et vice versa.
    Je pense que c'est surtout une question d'algorithmie, chose que la majorité des devs oublie aujourd'hui malheureusement.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 155
    Par défaut
    Ok merci !

    Tout d'abord une précision de départ : il ne s'agit pas d'itérer 3 <li> dans un <ul> mais par exemple d'itérer une géométrie complète dans une boucle de requestAnimationFrame() ... Donc le genre de truc où la performance compte vraiment.


    si tu a une empreinte mémoire de 1Mo sur un pc actuel, tu comprend bien que non, maintenant 250Mo sur une tel de 512Mo, bon la ya un énorme problème
    > Mais est ce qu'on peut dire que l'utilisation de la mémoire n'influe sur la vitesse que si elle vient à manquer, et que sinon ça ne pose pas trop de problème ?

    Exemple tu a besoin d'un tableau de 200Mo, plutot que de l'envoyer à une fonction (qui va crée une copie, tu te retrouve avec 400Mo ), exteriorise ta variable pour que les 2 fonctions y ai accès.
    D'ailleurs, a tu réelement besoin de ses 200Mo ? , dès le départ ?
    > Ça c'est justement un truc que je suis pas sur d'avoir bien saisi dans le fonctionnement général du js : le fait qu'une fonction "crée une copie"... Alors mettons que oui, j'ai besoin de traiter 200Mo dans ce genre de contexte...

    A ce moment là si je fais le code suivant je "déplie" 2 fois les 200Mo dans la mémoire c'est ce que ça veut dire ? C'est la raison pour laquelle il faut éviter les récursives ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var pomper = function( tableau_de_200Mo ){
    	var repomper = function( tableau_de_200Mo ){
    		var truc = ....
    		return truc;
    	}
    	return repomper( tableau_de_200Mo );
    }
    xx = pomper( tableau_de_200Mo );
    Et que veut dire "extérioriser" la variable dans ce cas ?

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2013
    Messages : 19
    Par défaut
    "Mais est ce qu'on peut dire que l'utilisation de la mémoire n'influe sur la vitesse que si elle vient à manquer, et que sinon ça ne pose pas trop de problème ?"

    C'est bien plus complexe que sa, dans l'absolue, quand tu crée un tableau de 200Mo, c'est pour t'en servir, tu va surement bouclé dessus, faire des recherche dessus,
    et la le proc y tourne.
    Une appli, au dela du programme a elle aussi besoin de mémoire, si tu a une appli qui consome 500Mo et qui tu a 512Mo de ram(on fait abstraction de l'os et autre appli),
    tu comprend qu'il ne te reste que 12Mo de mémoire utile.


    "Ça c'est justement un truc que je suis pas sur d'avoir bien saisi dans le fonctionnement général du js : le fait qu'une fonction "crée une copie" "
    Se n'est pas lié au js mais c'est un problème générale.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var tableau_de_200Mo = [...];
    var pomper=function(tableau_de_200Mo){
      // ici en gros l'argument tableau_de_200Mo est une copie (en vrai c'est beaucoup plus complexe que sa)
    }
    pomper(tableau_de_200Mo);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    var tableau_de_200Mo = [...];
    var pomper=function(){
      // ici tu travail sur le tableau puisqu'il est global, il ni a pas de coipe
    }
    pomper();
    En passant un argument, il crée une copie de l'argument

    En php, peut etre a déja tu vu sa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function pomper(&variable)
    ici on passe notre variable en réference, c'est a dire qu'on lui fournit l'adresse du tableau, il ne crée donc pas de copie puisque il sait ou est le tableau originale

    C'est un sujet complexe, sa dépend d'énormément de choses, ne serait ce du navigateur (moteur)

Discussions similaires

  1. JAG - Java API for Google Maps web Services
    Par gueekAddict dans le forum Projets
    Réponses: 1
    Dernier message: 16/12/2012, 15h59
  2. Google crée Analytics for Google Maps
    Par Hinault Romaric dans le forum APIs Google
    Réponses: 2
    Dernier message: 22/04/2012, 16h18
  3. array for noob
    Par xian21 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/09/2007, 11h50
  4. array for noob (je parle de moi ^^)
    Par xian21 dans le forum C#
    Réponses: 15
    Dernier message: 26/09/2007, 14h06
  5. MAPPING configuration error for request URI
    Par Turtle dans le forum JBuilder
    Réponses: 1
    Dernier message: 17/02/2005, 11h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo