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

Zend_Db PHP Discussion :

Performance : foreach sur rowset


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 15
    Par défaut Performance : foreach sur rowset
    Bonjour,

    J'ai constaté que faire un foreach sur un rowset de "300 000" éléments prenait 28 secondes.
    Par contre, si on fait un :
    $tab = $rowset->toArray();

    et qu'on effectue un foreach sur $tab, on retombe alors à 1 sec !

    Est-ce normal ?

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Par défaut
    Salut

    Tu sais sans doute que foreach sur un objet (c'est le cas ici) oblige PHP à utiliser des méthodes spéciales de l'objet, donc plusieurs appels de méthode à chaque itération ? L'objet sur lequel tu utilises foreach implémente l'interface Iterator :
    http://julien-pauli.developpez.com/t...php/spl/#LII-A

    En revanche, foreach sur un tableau est bien plus rapide à exécuter, c'est naturel.

    Je te propose de lancer une session de débogage avec un point d'arrêt sur foreach, et d'explorer ainsi ce qu'il se passe au moment où tu rentres dans la boucle pour comprendre ce qu'il se passe en interne dans ZF.

  3. #3
    Membre averti
    Inscrit en
    Juillet 2003
    Messages
    15
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 15
    Par défaut
    Merci, oui je sais que faire un foreach sur un rowset fait appel à la SPL de php.
    Je m'inquiétais simplement du résultat, que je trouve un peu exagéré quand même

    Entre temps, je suis tombé sur ce lien (benchmarks de la SPL) :
    http://www.roothack.org/content/php5...nal-benchmarks

    ça me rassure un peu (j'avais peur que ce soit un défaut de configuration PHP).

    ps : "non je ne ferais plus d'aggrégation de données à partir de rowset volumineux..."

  4. #4
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2009
    Messages : 2
    Par défaut
    Il aurait été intéressant que tu prenne en compte le temps d'éxécution de cette commande :

    $tab = $rowset->toArray();

    pour avoir une bonne comparaison entre les 2 méthodes .

    Est ce que $tab = $rowset->toArray(); suivis d'une boucle foreach est plus rapide qu'un foreach directement sur l'objet $rowset ? pas sur.

    Il ne faut jamais comparer 2 choses si une des variables est mise de coté.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. boucle foreach sur une liste de listes
    Par iblis dans le forum Langage
    Réponses: 10
    Dernier message: 02/05/2007, 19h10
  2. [PHP/SQL] foreach sur array multiples
    Par Flushovsky dans le forum Langage
    Réponses: 1
    Dernier message: 18/09/2006, 10h49
  3. [MySQL] Test de performance général sur une application PHP
    Par Invité dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 30/06/2006, 17h36
  4. Réponses: 1
    Dernier message: 11/03/2006, 21h19
  5. performances 9i sur linux
    Par learn dans le forum Oracle
    Réponses: 4
    Dernier message: 17/12/2004, 20h42

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