Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 24-02-2009 15:40:57

keilnoth
Membre
Date d'inscription: 30-08-2008
Messages: 128
Site web

[Zend_Date] 2.6Mo en mémoire pour quoi ?

Je viens de faire un petit test sur Zend_Date parce que j'ai visiblement d'énorme problème de mémoire utilisée par l'application que je suis en train de développer.

Le code tout simple dans mon plugin d'initialisation :

Code:

print(round(memory_get_usage() / 1024) . 'ko<br/>') ;
$date = new Zend_Date() ;
die(round(memory_get_usage() / 1024) . 'ko') ;

Résultat :

770ko
3385ko

Ca veut dire que juste l'initialisation d'une date prend 2.6Mo en mémoire sur le process courant. Quand nos administrateurs systèmes ont vu ça, ils se sont tous faire harakiri... smile

Tout ça pour dire, que malgré tout, et on en parlait il y a peu, Zend me semble être quand même une usine à gaz. Bien entendu, le parallèle est tranchant, mais quand l'initialisation d'une page basique prend 7Mo en RAM, on commence à se poser des questions... smile

Je vais de ce pas tester quelques optimisations possibles niveau serveur. Voire la suppression de certaines classes de Zend qui partent en sur-consommation dès l'initialisation.


Quelques tutoriaux Zend Framework !

Hors ligne

 

#2 24-02-2009 15:50:02

Guillhomme
Membre
Date d'inscription: 09-10-2008
Messages: 102

Re: [Zend_Date] 2.6Mo en mémoire pour quoi ?

Deja dit dans un autre sujet, le Zend_Date prend beaucoup de ressources ...
Si c'est un calcul pointu, je te conseillerai le cache, sinon utilise les fonctions basique.

Hors ligne

 

#3 25-02-2009 00:01:16

OsoPardo
Membre
Date d'inscription: 16-09-2008
Messages: 32

Re: [Zend_Date] 2.6Mo en mémoire pour quoi ?

Il faudrait regarder en détail quelles classe sont utilisées et chargés par Zend_Date, ce n'est peut être pas si grave que ça en à l'air car si on fait une boucle du genre :

Code:

$dates = array();
error_log(round(memory_get_usage() / 1024) . 'ko') ;
for($i=0; $i<101; $i++){
    $dates[] = new Zend_Date() ;
    if( $i % 10 == 0 )
        error_log($i.'-'.round(memory_get_usage() / 1024) . 'ko') ;
}

on obtient

Code:

2138ko
0-4470ko
10-4479ko
20-4489ko
30-4498ko
40-4508ko
50-4517ko
60-4526ko
70-4536ko
80-4545ko
90-4555ko
100-4564ko

Ce qui montre qu'on a probablement plus de 2Mo de classes chargées au premier appel mais qu'ensuite chaque objet prend un peu moins d'un 1ko

Ça fait certes beaucoup de mémoire consommée mais les classes chargées ne concerne pas que Zend_Date, un rapide coup d'oeil montre déjà que les classe Zend_Locale, Zend_Local_Format et Zend_Local_Math sont chargées :

Code:

//Extrait de Zend_Date
require_once 'Zend/Locale.php';
require_once 'Zend/Locale/Format.php';
require_once 'Zend/Locale/Math.php';

Ces classes là nécessitant elle-même le chargement d'autres classes, il se peut qu'il y ait un effet boule de neige mais que toutes les classes chargées soient utile à d'autres composants et pas seulement utilisées par Zend_Date.

Il faudrait aussi regarder ce que ça donne en activant l'auto-loader pour Zend (il me semble avoir vu un mini tuto sur le sujet quelque part), Zend_Locale n'est peut être pas forcement utile si on ne cherche pas à obtenir des dates 'localisées'.

Hors ligne

 

#4 25-02-2009 00:57:29

OsoPardo
Membre
Date d'inscription: 16-09-2008
Messages: 32

Re: [Zend_Date] 2.6Mo en mémoire pour quoi ?

En utilisant l'autoload pour les classes Zend_*, obtenu simplement en commentant tout les 'require_once' sauf dans Zend_Loader
et avec quelque chose comme :

Code:

set_include_path('.'
. PATH_SEPARATOR . './library'
. PATH_SEPARATOR . './application/models/'
. PATH_SEPARATOR . get_include_path());

require_once 'Zend/Loader.php';

Zend_Loader::registerAutoload();

en tête du bootstrap

j'obtiens :

Code:

1505ko
0-3141ko
10-3153ko
...
100-3239ko

Il y a du mieux !

En passant une page avec pas mal d'idées d'optimisation :
http://till.vox.com/library/post/zendfr … mance.html
et le guide d'optimisation de la documentation officielle
http://framework.zend.com/manual/fr/performance.html

Dernière modification par OsoPardo (25-02-2009 00:58:19)

Hors ligne

 

#5 25-02-2009 09:06:36

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [Zend_Date] 2.6Mo en mémoire pour quoi ?

Si quelqu'un est motivé, il y aurait un autre test à faire, c'est de regarder si quand on active APC, les classes chargées par Zend_Date sont chargées une fois pour tous les process ou bien une fois par process... (dsl, je n'ai pas le temps de m'y coller en ce moment...)

J'avoue que quelle que soit la taille utilisée, je ne pense pas me passer de Zend_Date. Quasiment tous les sites sont en multilangues, la gestion des dates à la main c'est un b...l innommable, vu la complexité des traitements mis en jeux, je trouve ça logique que ça soit une partie complexe du framework...

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

Hors ligne

 

#6 25-02-2009 09:35:56

Julien
Membre
Date d'inscription: 16-03-2007
Messages: 501

Re: [Zend_Date] 2.6Mo en mémoire pour quoi ?

APC ou pas ça sera pareil.
APC ne fait que garder l'OPCode en mémoire centrale (process père Apache), la création d'une instance est en mémoire "temporaire" (dans le process fils Apache qui traite la requête).

Zend_Date émule un entier 64 bits pour faire des calculs sur des dates bien en deça et au dela du timestamp classique (1970-2038).
Le code source de Zend_Date est le plus gros code source de tout le ZF car il fait pas loin de 6000 lignes.
Il est tout à fait normal que la création de 2 objets n'impacte que peu la mémoire, PHP étant basé sur le principe du "COW" (Copy On Write) niveau mémoire.

Quant à Zend_Locale et autres, une date étant localisable, il est normal que celle-ci utilise Zend_Locale :-)

PS : allez voir l'empreinte mémoire de certains objets Java, je vous assure qu'on parle pas de 2 malheureux Mo là :-D

Hors ligne

 

#7 25-02-2009 16:52:11

2mx
Membre
Lieu: Grenoble
Date d'inscription: 06-08-2007
Messages: 125

Re: [Zend_Date] 2.6Mo en mémoire pour quoi ?

Bon, je veux pas polémiqué sur Zend_Date mais c'est vrai qu'elle est lourd et vraiment lente cette classe. Elle est lente en partie a cause de la gestion 64bit et la façon dont elle accède aux fichier de traduction CLDR (via Zend_Locale). Du coup à l'époque du ZF v 1.0 j'ai complétement laissé tombé Zend_Date et je me suis rabattu sur DateTime (
http://julien-pauli.developpez.com/tuto … tes/#LIV-A ) et pour l'internationalisation je me suis inspiré de Prado pour développer une class basé sur DateTime. J'avais fait quelques tests à l'époque et ça donner ça http://www.z-f.fr/forum/viewtopic.php?id=644

Si ça peut aider quelqu'un les sources sont ici http://2mx.fr/medias/forums/ZF/Mmx_Date.zip

Mais apparemment des amélioration sur  Zend_Locale  et CLDR on était faite pour la version 1.6 du ZF et thomas annonce quelques améliorations sur Zend_Date pour la 1.8 :
http://www.thomasweidner.com/flatpress/ … -of-dates/

Je serrai aussi d'avis de laissé tombé ce calcul sur 64bits car avoir des dates  au dela du timestamp classique ne répond pas vraiment à la règle des 80/20 (qui est pourtant un des mantra de ZF) smile

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages