» » Оптимізація РНР-сценаріїв. Частина 2. Побудова профілю програми

Оптимізація РНР-сценаріїв. Частина 2. Побудова профілю програми

Секрет пошуку оптимальних варіантів - побудова профілю програми.

У процесі оптимізації і прискорення коду, незалежно від того, на якій мові програмування написаний код, єдино важливим завданням є пошук «вузьких місць» (bottleneck) у додатку. Адже якщо ви не знаєте, що саме є причиною уповільнення роботи програми (пошук цієї причини називається профілюванням, або побудовою профілю), впоратися з проблемою буде неможливо.

Незважаючи на існування великої кількості професійних інструментальних засобів, призначених для профілювання додатків, способи, на основі яких будується процес оптимізації, можна реалізувати за допомогою самого простого РНР-сценарію (виняток можуть становити інтенсивно використовувані додатки). Для зручності сприйняття матеріалу внизу надано код класу, який можна використовувати як шаблон для вирішення основних завдань профілювання. Цей сценарій буде використовуватися для профілювання всіх способів оптимізації, про які буде говоритися далі.

Базовий профілювальник РНР
<?php
set_time_limit(0);
class simple_profiler
{
  private $start_time;
  private function get_time() (
    list($usec, $seconds) = explode(" ", microtime());
    return ((float)$usec + (float)$seconds);
  }
  function start_timer() {
    $this--->start_time = $this->get_time();
  }
 
  function end_timer() {
   return ($this->get_time() - $this->start_time);
  }
 }
 
 $timer = new simple_profiler();
  * Вставьте здесь постоянный код инициализации
 
 $timer->start_timer(); // запускаем таймер
 /**********************************
  * Вставьте здесь код для метода #1
 <em>
 $old_time = $timer->end_timer(); // останавливаем таймер
 $timer->start_timer(); // запускаем таймер
 * Вставьте здесь код для метода #2
 
 $new_time = $timer->end_timer(); // останавливаем таймер
 echo "Метод #1 выполнялся $old time секунд.\n";
 echo "Метод #2 выполнялся $old_time секунд.\n\n";
 if($old_time > $new_time) {
 $percent - number_format(100 - (($new_time / $old_time) * 100), 2);
 echo "Метод #2 был быстрее метода #1 на $percent%\n";
 } else {
 $percent = number_format(100 - (($old_time / $new_time) * 100), 2);
 echo "Метод #1 был быстрее метода #2 на $percent%\n";
 }
 ?>


Вище було визначено простий клас, відповідний для більшості завдань по профілізації програм - simple_profiler. З функціональної точки зору код для побудови профілю являє собою ні що інше, як високоточний вимірювач часу, який відводиться на виконання певного сегмента РНР кода. Інша частина сценарію служить як шаблон, який можна використовувати для порівняння двох різних способів, застосовуваних для виконання однієї і тієї ж задачі, щоб визначити, який з них виконується швидше.

Даний шаблонний сценарій має три сегменти, що представляють для нас інтерес (ці сегменти позначаються коментарями-заповнювачами). Перший сегмент є сегментом ініціалізації, в якому зручно ініціалізувати частини сценарію, що не беруть участь в профілізації. Зокрема, цей сегмент буде корисний для створення фіктивних даних (якщо вивчається обробка даних), включаючи файли та інше. Другий і третій сегменти служать як заповнювачі для самого досліджуваного коду. Між цими двома сегментами немає особливої ​​різниці за винятком того, що в кожному з них має бути реалізований відрізняється спосіб виконання однієї і тієї ж задачі.

Під час виконання сценарію реєструється кількість часу, витраченого на виконання кожного способу, і порівнюються результати роботи двох методів, що дозволяє встановити, який з них працює швидше. Щоб зрозуміти, наскільки один метод ефективніше іншого, поряд із значенням часу виконання виводиться процентне співвідношення, що показує загальне поліпшення.


476 12.01.14



Напівжирний Нахилений текст Підкреслений текст Перекреслений текст | Вирівнювання по лівому краю По центру Вирівнювання по правому краю | Вставка смайликів Вибір кольору | Прихований текст Вставка цитати Перетворити вибраний текст з транслітерації в кирилицю Вставка спойлеру