Sujet : import(...) and load()

Hey smile,

Dans les anciennes versions de Hoa, la fonction import() (alias de la méthode Hoa_Framework::import()) avait une arité de 2. Le second paramètre permettait de charger le fichier directement. Ce dernier a disparu.

Petit rappel historique

Dans Hoa, on utilise la fonction import() pour importer des paquetages. Il existe son homologue importModule() pour importer des paquetages Hoathis. Cette fonction est indépendante de la plateforme et permet un contrôle plus fin de la mémoire car contrôle les chargements de fichier.
Depuis la version 0.5.x, la fonction import() met en place la notion de pré-chargement, c'est à dire que la fonction import() enregistre un fichier dans un registre d'importation mais ne charge pas le fichier ! Si on a besoin de charger ce fichier, l'auto-chargement va se déclencher, vérifier que le fichier existe dans le registre et enfin le charge.

Pour charger directement le fichier, on pouvait passer un booléen (true en l'occurence) en second paramètre de la fonction import().

true ou load() ?

Sauf que true n'est pas super parlant. C'est pourquoi j'ai ajouté la fonction load() qui permet de charger tous les fichiers que l'on vient d'importer. Si plusieurs appels successifs de la fonction import() sont réalisés, la fonction load() ne chargera que les derniers fichiers du dernier import.

Exemple :

import('File.~') and load(); // ne charge qu'un seul fichier : Hoa_File
import('File.*') and load(); // charge tous les fichiers du paquetage Hoa_File.

Si on n'appelle pas load(), on attend que l'auto-chargeur fasse son travail.

Pourquoi load() au final ?

Le but de import() est d'éviter que l'on charge des fichiers pour rien. On ne charge que ce dont on a strictement besoin grâce à l'auto-chargeur qui -- quand il échoue lors d'un appel de classe -- va chercher un fichier où pourrait se trouver cette classe. Seulement, parfois, on est sûr que l'on va charger ce fichier. Si par exemple on a un héritage, rien ne sert d'attendre que l'auto-chargeur fasse son travail. On préfère donc éviter un échec, un temps CPU, une recherche etc. On va donc charger le fichier directement après l'importation.

Conclusion

On a gagné beaucoup de mémoire et de précieuses millisecondes avec la fonction import(). Ça avait un impact significatif sur les applications. Avec load(), on ne gagnera pas de mémoires mais quelques 0,01 millisecondes. Vous allez me dire que c'est négligeable ! Oui, mais non. Pour les caches d'opcode (comme xcache ou APC), ça peut faire une différence de pas mal d'instructions. Donc la vitesse sera plus importante après mise en cache : moins de lectures, moins de recherches, moins de comparaisons d'opcode etc.
Autre avantage : la sémantique. Le code est plus lisible et on comprend mieux ce qu'il se passe wink.


Sur ce, je retourne réviser mon arabe et terminer la préparation de mon mariage en Tunisie wink.

« 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. »

Re : import(...) and load()

Bon mariage smile smile

" L'imagination est plus importante que la connaissance. La connaissance est limitée alors que l'imagination englobe le monde entier, stimule le progrès, suscite l'évolution. " - Life in the cloud :: Getting Started with Hoa - Hoa débutant

3

Re : import(...) and load()

Dans la lignée des optimisations que l'on trouve dans le tronc en ce moment, on pourra voir un système de cache au niveau de Hoa_Framework_Protocol. Ainsi, on gagne un temps certain sur la résolution des chemins hoa://. Si par exemple on fait :

if(file_exists('hoa://Data/Foo/Ba.r'))
    $foo = require 'hoa://Data/Foo/Bar.r');

on ne résolvera qu'une seule fois le chemin, puis on ira le chercher en cache la seconde fois.

Ceci pour vous incitez à de plus en plus utiliser le protocole hoa:// car c'est bon pour vous et ça ne ralentit pas vos applications wink.

« 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. »