Скорость почти выросла на пол минуты!
В общем всё дело, оказывается, в /app/code/core/Mage/Core/functions.php функция __autoload().
info: Она (__autoload) служит для автоматической загрузки файла класса которую использует PHP5 если определение класса не найденна перед его использованием.
Как видно в оригинальной functions.php параметр функции парсится на кусочки, строится относительны путь файла и вводится в include()
После этого PHP5 с ‘бешеной’ скоростью начинает рыть файловую систему для поиска файла, путь которого задан относительно. Это стоит ему много труда и времени, да и общее время суммируется для всех файлов. Задав абсолютный путь, работа для него намного упрощается.
Приблизительно вот так:
function __autoload($class)
{
if (strpos($class, '/')!==false) {
return;
}
$classFile = uc_words($class, DS).'.php';
$a = explode('_', $class);
Varien_Profiler::start('AUTOLOAD');
Varien_Profiler::start('AUTOLOAD: '.$a[0]);
$firstWay = $a[0];
$cPrefix = '';
switch ($firstWay){
case 'Zend':
case 'Varien':
$cPrefix = '/web/projects/magento_dev/lib/';
break;
case 'Mage':
$cPrefix = '/web/projects/magento_dev/app/code/core/';
break;
}
include ($cPrefix . $classFile);
Varien_Profiler::stop('AUTOLOAD');
Varien_Profiler::stop('AUTOLOAD: '.$a[0]);
}
Пользователям Windows для тестировки лучше использовать двойную обратную косую черту для разделителей папок в место обычной косой (/) так как и здесь съедается некоторое количество времени.
для проверки чистого времени рендеринга можно использовать в index.php временно следующее:
function getmicrotime() {
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();
require_once 'app/Mage.php';
umask(0);
Mage::run('base');
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "Rendered in $time seconds";
В Linux временной выигрыш чуть меньше из-за лучшего I/O показателя для файлов, чем в Windows.


1Moshe posted Fri, February 1, 2008
K сожалению мы не сможем включить эти изменения в распространяемую копию, т.к. это сломает community и local модули.
Kстати, в PHP5 microtime(true) возвращает float.
2Garri posted Fri, February 1, 2008
Ну хорошо, если нет возможности каким либо образом автоматизировать. Нет так нет
Тем более что это может сломать community и local модули. Однако всегда можно что-то да и придумать.
3Garri posted Fri, February 1, 2008
Единственно что мне хотелось так это попробовать помочь разогнать магенто в скорости.
4Garri posted Fri, February 1, 2008
Стоит ли мне далее что-либо предпринимать в области оптимизации SQL или кода? а то жаль времени.
5Michael posted Fri, February 1, 2008
Добрый день, Garri,
Конечно же, стоит. Мы всегда открыты для предложений по оптимизации Magento. Даже если по каким-либо причинам не все из предложенных изменений могут быть включены в основной релиз, мы обязательно укажем их в качестве дополнительного варианта оптимизации в документации.
Спасибо.
6Garri posted Fri, February 1, 2008
Только что проверил на сильной машине там разница конечно не большая с 2.2 sec в 1.9 sec
Это не то что на моём старом нотебук.
В общем ничего не буду далее искать. А тем более что это никому не нужно. Тут важнее сэкономить время на developing. Через пару лет машины будут на сотнях CORE.
7Garri posted Sun, February 3, 2008
Возникла идея:
Можно все пути классов сохранить в Cache.
Если например classPathCacheEnabled тогда если найден Mapping : className => classPath использовать его если нет то внести сначала в Cache. Так же можно заключить в try/catch некоторую логику и в случае, например при не нахождении файла и если Cache включен, а разработчик изменил имя класса или его физический путь то автоматом правится Mapping в Cache.
В таком варианте community и local модули ни как не смогут поломаться.
8Garri posted Mon, February 4, 2008
Была бы моя воля я бы везде использовал следующую кострукцию:
Mage:import(’Mage_...’), Mage:importOnce(’Mage_...’)
и т.д. включительно ZF и Varien классы.
Отрицательная сторона это то что мой IDE - Eclipse не сможет правильно определить Модель Классов в своём Кеше, но это не так уж и важно если данный метод того стоит.