Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
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 :
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...
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...
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.
Hors ligne
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
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 :
$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
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 :
//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
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 :
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 :
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
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
Hors ligne
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
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)
Hors ligne
Pages: 1