Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Estive vendo a função spl_autoload_register() e achei super interessante e útil. Mas levantou uma questão de performance quando eu implementei essa função em meus projetos.
Talvez, alguns achem que não há nenhum problema na questão que vou mencionar abaixo, porém, Eu dou grande valor à performance/desempenho de uma aplicação e não meço esforços para melhorar o código para alcançar o melhor resultado. Esse fascínio é por causa que uma aplicação de grande porte pode usar o seu código e o desempenho pode ser um fator importante para o sucesso da aplicação como um todo.
Então vamos lá...
Um exemplo simples de autoload:
Nome da aplicação: Imaster
Classes:
Arquivo: /forum/Imaster.class.php
class Imaster {}
Arquivo: /forum/Forum.class.php
class Forum {}
Arquivo: /forum/topico/Pergunta.class.php
class Pergunta {}
Diretórios dos arquivos
/forum/Imaster.class.php
/forum/Forum.class.php
/forum/topico/Pergunta.class.php
Agora nosso autoload para carregar a aplicação Imaster
Arquivo: /forum/_autoload.php
> function autoload($className){
//carrega arquivos pesquisando nos diretórios da aplicação Imaster
}
Teste
new Imaster();
new Forum();
new Pergunta();
//output
OK, classes instanciadas.
----
Agora a questão da Performance/Desempenho
----
Agora imaginemos uma outra aplicação.
Nome da aplicação: Smile
Classes:
Arquivo: /emoticon/Smile.class.php
class Smile {}
Arquivo: /emoticon/icones/Carinhas.class.php
class Carinhas {}
Diretórios dos arquivos
/emoticon/Smiles.class.php
/emoticon/icones/Carinhas.class.php
Autoload para carregar a aplicação Smile
Arquivo: /emoticon/_autoload.php
> function autoloadSmile($className){
//carrega arquivos pesquisando nos diretórios da aplicação Smile
}
-----------------------------
Usando as duas bibliotecas numa aplicação qualquer.
Arquivo: /Imaster.php
include_once('/forum/_autoload.php');include_once('/emoticon/_autoload.php');
//registra os autoloader que farão o carregamento dos arquivos requisitados
spl_autoload_register('autoload');
spl_autoload_register('autoloadSmile');
//Instanciando classes
//aplicação: Imaster
new Imaster();
new Forum();
new Pergunta();
//aplicação: Smile
new Smile();
new Carinhas();
//output
OK, todas as classes foram instanciadas.
A QUESTÃO
No arquivo Imaster.php, rodaria sem problema. Porém, quando queremos instanciar as classes da aplicação Smile, o autoload que irá ser requisitado primeiro será o da aplicação Imaster, então, será percorrido todos os diretórios desta aplicação para ver se acha os arquivos da aplicação Smile, sem sucesso, irá para o próximo autoload registrado (no caso o autoloadSmile), agora sim, irá achar os arquivos da aplicação Smile.
Exemplo da questão citada acima:
ao executar new Smile(); a aplicação irá fazer isso:
Tenta pelo /forum/_autoload.php
Checando se existe: /forum/Smile.class.php [não encontrado]
Checando se existe: /forum/topico/Smile.class.php [não encontrado]
Tenta pelo /emoticon/_autoload.php
Checando se existe: /emoticon/Smile.class.php [encontrado]
Nesta verificação sem sucesso, a aplicação pode perder muito tempo e performance se o primeiro autoload tiver muitos diretórios para checar... a minha idéia seria indicar à função spl_autoload, o autoload a ser executado primeiro, ou seja, reorganizar a ordem dos autoloads registrados.
Exemplo para demonstrar a idéia:
Arquivo: /Imaster.php
include_once('/forum/_autoload.php');include_once('/emoticon/_autoload.php');
//registra os autoloader que farão o carregamento dos arquivos requisitados
spl_autoload_register('autoload');
spl_autoload_register('autoloadSmile');
//Instanciando classes
//aplicação: Imaster
new Imaster();
new Forum();
new Pergunta();
//aplicação: Smile
spl_autoload_primary('autoloadSmile'); //ESSA FUNÇÃO NÃO EXISTE, É APENAS PARA DEMONSTRAR A IDÉIA
new Smile();
new Carinhas();
//output
OK, todas as classes foram instanciadas.
No caso acima, a aplicação não perderia tempo em pesquisar diretórios errados, iria direto no seu.
Alguém tem sugestões de como pode ser implementado essa idéia?
Carregando comentários...