Performance et require_once

Eléphanteau du PHP | 27 Messages

16 avr. 2008, 18:26

Bonjour,

une petite question me taraude... En terme de performance, y a t-il un bénéfice à faire
class_exists('MaClass') or require_once 'MaClass.php';
plutôt que
require_once 'MaClass.php';


??

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]
Modifié en dernier par damdec le 17 avr. 2008, 13:54, modifié 2 fois.

ViPHP
ViPHP | 5924 Messages

16 avr. 2008, 18:30

Fais un bench.
Mais personnellement, je verrais plutôt le bénéfice fonctionnel de la fonction __autoload()…

Eléphant du PHP | 259 Messages

16 avr. 2008, 22:13

J'ai cru lire quelque part (me demandez pas ou, je sais plus) que les perfs de [require/include]_once étaient désastreuses comparées à include/require.

Donc quitte à faire un test avec class_exists(), autant utiliser un simple require puisque l'effet sera le même.

Sinon Sekiltoyai a donné la meilleure méthode je dirais :)

ViPHP
ViPHP | 5924 Messages

16 avr. 2008, 22:48

Sinon Sekiltoyai a donné la meilleure méthode je dirais :)
Non, c'est trop, c'est trop :D :mrgreen:

Eléphant du PHP | 259 Messages

16 avr. 2008, 23:43

Non, non, il faut dire ce qui est !

Pour le chèque t'as bien tout noté hein ?

ViPHP
ViPHP | 4674 Messages

17 avr. 2008, 00:10

Hey :),

include/require _once ne sont pas désastreux mais c'est vrai que ça vient vite lourd. Pourquoi ? Parce qu'en fait, il stocke les noms des fichiers en mémoire. Donc à chaque include/require _once, il va vérifier si le fichier n'a pas déjà été inclue ou pas. L'étape de vérification ajoute un temps supplémentaire à la charge du fichier en mémoire, c'est tout à fait normal. De là à dire que c'est désastreux ...
Pour d'énormes applications ou frameworks (tels Joomla! ou Zend Framework), oui, ça peut vraiment ralentir le système de ... quelques dixièmes de secondes (mais accumulées à tout le reste ...). Mais oui, fais un bench sur des include/require _once de 1000 fichiers, tu seras fixé ;-).

Néanmoins, tu peux utiliser ta propre fonction ou la méthode d'auto-chargement, comme l'a si bien suggéré Sékil ;-). Comment faire ta propre fonction maison ? Voir le statisme de PHP. Je te fais confiance Jules, t'es pas un débutant, tu sais lire le manuel ;-).

Après, tout dépend de tes besoins. Ici tu nous donnes l'exemple avec class_exists, donc je vais évidemment dans le sens de Sékil : auto-chargement.
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

Eléphanteau du PHP | 27 Messages

17 avr. 2008, 13:52

Merci de vos réponses, quand j'aurais le temps je ferais un bench et je viendrais vous dire les résultats , en attendant j'opte pour la fonction maison.

Administrateur PHPfrance
Administrateur PHPfrance | 3088 Messages

17 avr. 2008, 14:21

Pourquoi ? Parce qu'en fait, il stocke les noms des fichiers en mémoire.
Si mes souvenirs sont bons, je crois me rappeler que la différence de performance est dûe à la nécessité de normaliser les chemins d'accès par realpath() pour les chemins relatifs. Entre-temps, PHP s'est doté d'un cache pour realpath() donc l'écart à dû se réduire dans certains cas. Il y a peut-être aussi un processus de normalisation pour les chemins absolus pour éviter d'inclure le même fichier via deux chemins différents (liens symboliques). Pour les chemins relatifs, il y a aussi la gestion d'include_path, qui force PHP à chercher le fichier sous plusieurs chemins d'accès, d'ailleurs.

damdec, si tu veux mesurer de ton côté, essaie d'utiliser des chemins absolus plutôt que des chemins relatifs. Dans tous les cas, à l'échelle d'une page normale (<10 includes) je doute que la différence soit mesurable, c'est pour ça qu'__autoload() et spl_autoload() sont préférables.

ViPHP
ViPHP | 4674 Messages

17 avr. 2008, 14:45

J'avais entendu de ce genre de cache mais je n'étais pas sûr. Est-ce que quelqu'un connaît un peu mieux ?
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

ViPHP
ViPHP | 5924 Messages

17 avr. 2008, 19:28

C'eût peut être été plus malin de stocker les inodes, non ? :-/

ViPHP
ViPHP | 4674 Messages

17 avr. 2008, 19:32

Oui, c'est ce que je pensais et je regardais les sources de PHP pour savoir pourquoi il ne fait pas ça. Mais je n'ai pas pris beaucoup de temps et j'ai pas trouvé. S'il y a un volontaire (ou sinon, je poursuivrai ma recherche plus tard).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).

x@v
Mammouth du PHP | 570 Messages

18 avr. 2008, 01:22

dans la doc il est dit
<?php
function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MaClasse1();
$obj2 = new MaClasse2();
?>
Mais pour moi l'utilisation n'et pas très clair ?
faut-il déclarer cette fonction dans chaque fichier ?

ViPHP
ViPHP | 5924 Messages

18 avr. 2008, 01:58

Tu la déclares une seule fois, dans le fichier principal, à chaque fois qu'une classe inexistante sera appelée, cette fonction sera appelée avec en argument le nom de la classe à charger. Ton but est alors d'inclure le fichier dans lequel est définie la classe, afin que le moteur puisse la charger…

x@v
Mammouth du PHP | 570 Messages

18 avr. 2008, 10:22

en faite en java on fait justement comme ça, je veux dire une classe porte toujours le nom du fichier.
Ce n'est pas l'esprit de php ?
Y-a-t'il un lien sur le sujet :?:

ViPHP
ViPHP | 4674 Messages

18 avr. 2008, 11:20

La gestion des paquetages dans PHP est plus libre que dans Java. Le nom des fichiers est indépendant du nom des classes qu'il contient car à l'origine, PHP n'avait pas d'objet. Aujourd'hui il mélange le fonctionnel, l'objet etc., donc on ne peut pas imposer de telles normes (sans voir arriver un tsunami de personnes en détresses sur ce forum ;-)).
On n'a toujours pas cette notion de classe privée ou restreinte en PHP que l'on retrouve en Java. Tu peux également avoir plusieurs classes dans un même fichier. On peut aussi très bien imaginer un objet avec des méthodes statiques et des fonctions alias vers ces méthodes statiques, le tout dans un même fichier. C'est très souple et très puissant, mais il faut avoir de la rigueur.

En revanche, si tu utilises les bonnes normes et codages, tu peux utiliser de façon très intelligente ta méthode __autoload. C'est à dire découper le nom de la classe à instancier pour retracer le chemin et l'inclure. Tu retrouveras ainsi un comportement similaire au paquetage Java.

Justement, il y a un sujet en ce moment avec des liens intéressants sur les normes et conventions de codage. Tu devrais trouver tout ce qu'il te faut là-dedans :).
« Un handicap est le résultat d'une rencontre entre une déficience ou différence et une incapacité de la société à répondre à celle-ci. »

Hoa : http://hoa-project.net (sur @hoaproject).