Почему этот код такой быстрый? - PullRequest
3 голосов
/ 18 декабря 2010

РЕДАКТИРОВАТЬ : Это произошло из-за ошибки в моем коде (вероятно), после отладки и добавления проверки правильности ответа в моих тестах, тест доказывает, что НЕТ разницы (что меня раздражает), больше в мой собственный ответ ниже.
/ EDIT

Здравствуйте,

Я написал небольшую CSS-оболочку для SASS для PHP и запрограммировал ее для принятия имени файла и возможных флагов перед запуском (и, возможно, кэшированием, если не помечено иначе) моего файла SASS.

Я также провел несколько тестов и номер версии. 2 что-то около 2x - 4x медленнее, чем номер версии. 1 , хотя версия 1 должна выполнить больше кода, чем версия 2 (он включает прямое включение с диска, а не анализирует сначала URL-адрес для флагов).

Я не понимаю, почему на самом деле и тесты слишком непоследовательны, чтобы вызывать их из-за проблем с доступом к диску.

Вот тесты скорости:

Сначала - сгенерировать файл, затем - просто потребовать из кеша
Итого по версии 1: 10,886 с: 10,886 мс / файл в первую очередь: 466,42 мс
Всего версии 2: 21,235 с: 21,235 мс / файл в первую очередь: 14,54 мс

Просто требуется из кеша
Итого по версии 1: 7,886 с, в среднем: 7,886 мс / файл первым: 2,93 мс
Всего версии 2: 21,657 с, в среднем: 21,657 мс / файл первым: 6,98 мс

Версия с readfile вместо require
Версия 1, прогон 1: всего: 7,915 ср: 7,915 мс / файл сначала: 2,49 мс
Версия 2, прогон 1: всего: 9.508 avg: 9.508 мс / файл сначала: 3.23 мс
Версия 1, запуск 2: всего: 1: 17.137 avg: 7.714 мс / файл сначала: 4.61 мс
Версия 2, запуск 2: всего: 1: 15,717 avg: 7,572 мс / файл сначала: 2,69 мс * - пробег 2 был 10 000 вызовов.

Версия 1

/* HELPER FUNCTIONS */
function is_option($opt) { global $url_options; return in_array($opt,$url_options); }
function fail($message) { echo $message; die(); }

//prepare options array
$options=array();

$url_options = @explode('_',basename($_GET['f']));
if (!is_array($url_options))
    { fail('Wrong parameters given (or parameter can\'t be accepted)'); }
$loadfile = array_shift($url_options);

if (!file_exists('source/'.$loadfile.'.sass'))
{
    if (!file_exists('source/'.$loadfile.'.scss'))
        fail('Wrong parameters given (file doesn\'t exist)');
    else
        $options['property_syntax']='scss';
}else{
    $options['property_syntax']='sass';
}

$src_file = 'source/'.$loadfile.'.'.$options['property_syntax'];
$css_file = 'cache/'.$loadfile.'.css';

if (file_exists($css_file) && !is_option('no-cache'))
{
    header('content-type: text/css');
    require($css_file);
    die(); //ALL OK, loaded from cache
}

Версия 2

//quick! load from cache if exists!
if (file_exists('cache/'.($cachefile=basename('/',$_GET['f']))))
{
    header('content-type: text/css');
    require('cache/'.$cachefile);
    die(); //ALL OK, loaded from cache
}

/* HELPER FUNCTIONS */
function is_option($opt) { global $url_options; return in_array($opt,$url_options); }
function fail($message) { echo $message; die(); }

//prepare options array
$options=array();

$url_options = @explode('_',basename($cachefile));
if (!is_array($url_options))
    { fail('Wrong parameters given (or parameter can\'t be accepted)'); }
$loadfile = array_shift($url_options);

if (!file_exists('source/'.$loadfile.'.sass'))
{
    if (!file_exists('source/'.$loadfile.'.scss'))
        fail('Wrong parameters given (file doesn\'t exist)');
    else
        $options['property_syntax']='scss';
}else{
    $options['property_syntax']='sass';
}

$src_file = 'source/'.$loadfile.'.'.$options['property_syntax'];
$css_file = 'cache/'.$loadfile.'.css';

Я пойду с версией 1, вероятно, я просто хотел бы понять, ПОЧЕМУ именно v2 медленнее, хотя он выполняет меньше кода ...

РЕДАКТИРОВАТЬ: Кажется, что readfile немного быстрее, чем require, принес две статистически одинаковые версии, хотя версия 1 все еще быстрее (но это всего 2 секунды для вызовов 1000 И 10000, так что это может быть случайное использование диска)

Ответы [ 3 ]

1 голос
/ 18 декабря 2010

Кажется, есть ошибка в

  if (file_exists('cache/'.($cachefile=basename('/',$_GET['f']))))

либо

  • есть тип и explode хотел бы использовать вместо
  • или basename не используется должным образом - то есть basename($_GET['f']) вместо basename('/', $_GET['f'])

Следовательно, $cachefile пусто, if всегда true и require применяется к каталогу cache.

1 голос
/ 18 декабря 2010

Итак, основное отличие было связано с ошибкой в ​​моем коде, обозначенной ring0 (спасибо).

После исправления ошибки, отредактировав тесты так, чтобы они отображали ответы в каждом (n / 10) -м случае из n итераций и запустив оба теста параллельно, получаются следующие результаты:

Результаты для версии 1 (с требуется):
Обработанный 10000 раз
Потребовалось 4: 56,806 [* 1 020 * 1292676882 * * тысяча двадцать одна - 1292677179 * +1023 *]
Средняя время: 29,681 милисекунды

Результаты для версии 1 (с ReadFile):
Обработанный 10000 раз
Потребовалось 4: 35,242 [ 1292677437 - 1292677712 ]
Средняя время: 27,524 милисекунды

Результаты для версии 2 (с требуется):
Обработанный 10000 раз
Потребовалось 4: 55,760 [ 1292676879 - 1292677175 ]
Средняя время: 29.576 милисекунды

Результаты для версии 2 (с ReadFile):
Обработанный 10000 раз
Потребовалось 4: 32,336 [ 1292677433 - 1292677706 ]
Средняя время: 27,234 милисекунд

График:
Speeds for 10,000 iteration calls

So, the new version/version 2 (the one, where the require/readfile is on top) is faster now, although not that significantly. I'll probably use that one, together with readfile enhancement (thanks to Эмиль ).

Спасибо всем, это то, что происходит, если вы не выполняете тестирование должным образом:)

Вот что происходит

1 голос
/ 18 декабря 2010

Что вы имеете в виду, «версия 2 должна запускать больше кода»?

Версия 2 сначала проверяет кэш и пропускает все остальные, если находит файл в кэше.

Конечно, он также полностью игнорирует все «параметры URL».

...