Are there performance downsides while using autolo

2019-04-21 14:40发布

问题:

Currently I load in all my classes by including a "all.inc.php" file on every page of my site, this file then goes on to include all the config, classes, functions, etc. that I will use on the whole site.

My issue with this is that often I use classes that only pertain to certain pages/sections of a website, so often I am including a bunch of classes at the start of the page which will not be used.

Obviously autoloading the classes would fix this issue, so my question is, would autoloading the classes give me a performace downside as the server then has to check if a file exists? And if there is a downside, then is this downside worse than having to include a number of classes that may not get used on the page? Or is the difference negatable?

回答1:

This article has some information and benchmarks: PHP autoload performance. Conclusion:

Autoloading does not significantly degrade performance. Include_path lookup, reading and parsing PHP scripts from disk takes much longer time than that bare autoloading logic costs.



回答2:

Autoloading a class is almost as fast as including the class in the normal way. Switching to autoloading will improve performance in your case, because PHP loads less files and classes.



回答3:

Autoloading will improve the performance if the script does not have to search the files each time in the filesystem. If you use namespaces you can have a nice mapping of the namespace and class name to a folder and file like Some/Nice/ClassName would map to Some/Nice/ClassName.php.

If you do not use namespaces and have to search through folders I suggest you to create a custom singleton class to include files that allows you to do something like:

App::uses('Some/Nice', 'ClassName');

In Autoload use the registered path and class name to map it to a path and file combining both args from the uses method in my example. This will allow you some namespace like functionality for class loading until you're ready to change your app to use namespaces.



回答4:

You should use autoloading with cache index of all available classes/files in project.

Example:

$class_cache=array(
    'MyClass'=>'lib/MyClass.php',
    'Item'=>'model/Item.php'
);

function __autoload($class_name) {
 if(array_key_exists($class_name))
   include $class_cache[$class_name];
 else
   throw new Exception("Unable to load $class_name.");
}

You need to keep class list actual or write some generator for $class_cache.



回答5:

Each include() and require() (and their _oncesiblings) carry a performance penalty on their own. Disk seeks and reads also come at a cost. It really depends on your code, if you are loading 20 classes but use only 2 or 3 at any single point, then it's definitely worth going the autoloading route.

If performance is your main concern, you should look into merging your class files into a single file and instantiate what you need.