Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Определение времени выполнения скрипта (Rumata)
Author Message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Mon Aug 15, 2005 10:04 pm (написано за 22 секунды)
   Post subject: Определение времени выполнения скрипта
Reply with quote

на написание этого короткого опуса меня сподвили две вещи
1. один из пунктов дискуссии в теме tIT-GP CMF v.01b (forum.dklab.ru/php/heap/Tit-gpCmfV01b.html)
2. собственная реализация счетчика выполнения скрипта

обычно замеры производятся по следующей схеме:
Code (php): скопировать код в буфер обмена
// code 1
$start_time = microtime (www.php.net/microtime)(true);
// here many php-inctructions
$exec_time = microtime (www.php.net/microtime)(true) - $start_time;
echo (www.php.net/echo) "Generation time: $exec_time";
иногда возникает необходимость в
а) тестировании времени выполнения некоторого фрагмента кода или
б) сравнении времени выполнения различных алгоритмов.

последний случай может выглядеть так
Code (php): скопировать код в буфер обмена
// code 2
$time[0] = microtime (www.php.net/microtime)(true); /* do action 1 */ $time[0] = microtime (www.php.net/microtime)(true) - $time[0];
...
$time[n] = microtime (www.php.net/microtime)(true); /* do action n */ $time[n] = microtime (www.php.net/microtime)(true) - $time[n];
на мой взгляд такие фрагменты достаточно логично выглядели бы
Code (php): скопировать код в буфер обмена
// code 3
$timer->start(); /* do action 1 */ $time[] = $timer->stop();
...
$timer->start(); /* do action n */ $time[] = $timer->stop();
такой псевдокод наводит на мысль о создании стека временнЫх интервалов
это фактически было уже предложена автором темы tIT-GP CMF v.01b (forum.dklab.ru/php/heap/Tit-gpCmfV01b.html). я же лишь обратил внимание на некоторые моменты в реализации и чуть позже сам использовал в собственных проектах. четно сказать, я до вступления в дискуссию темы сам писал по старинке (code 1 и code 2)


Structure.zip
 Description:

Download
 Filename:  Structure.zip
 Filesize:  2.21 KB
 Downloaded:  494 Time(s)

Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Mon Aug 15, 2005 10:55 pm (спустя 50 минут; написано за 4 минуты 4 секунды)
   Post subject:
Reply with quote

определение погрешности выполнения пары вызовов Timer::start() Timer::stop()
Code (php): скопировать код в буфер обмена
include 'Timer.php';
$timer =& new Timer;

$n = 1000;
$time = 0;
for ($i =0; $i < $n; $i++) {
        $timer->start();
        $time += $timer->stop();
}
$time /= $n;

echo (www.php.net/echo) "Average timer empty loop: $time";
Back to top
View user's profile Send private message
Владимир Хоменко
Участник форума



Joined: 11 Jun 2004
Posts: 427
Карма: 42
   поощрить/наказать

Location: Николаев, Украина

PostPosted: Tue Aug 16, 2005 11:30 am (спустя 12 часов 35 минут; написано за 2 минуты 27 секунд)
   Post subject:
Reply with quote

Rumata

Может быть все-таки точнее так:
Code (php): скопировать код в буфер обмена
include 'Timer.php';
$timer =& new Timer;

$n = 1000;
$start_time = microtime (www.php.net/microtime)(true);
for ($i =0; $i < $n; $i++) {
        $timer->start();
        $timer->stop();
}
$time = (microtime (www.php.net/microtime)(true) - $start_time) / $n;

echo (www.php.net/echo) "Average timer empty loop: $time";
?

А то получается, что для определения времени вызова функций вы опираетесь на эти же функции.
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Tue Aug 16, 2005 12:03 pm (спустя 33 минуты; написано за 50 секунд)
   Post subject:
Reply with quote

нет. вызов процедуры быстрее чем выражения инициализации и изменения цикла
Back to top
View user's profile Send private message
Артeм Дивинcкий
Участник форума



Joined: 19 Jul 2005
Posts: 61
Карма: 6
   поощрить/наказать


PostPosted: Tue Aug 16, 2005 1:15 pm (спустя 1 час 12 минут; написано за 5 минут 42 секунды)
   Post subject:
Reply with quote

Вот ещё, принцип все тот-же:
Code (php): скопировать код в буфер обмена
<?php

  if (!defined (www.php.net/defined)("_PMF_profiler")) define (www.php.net/define)('_PMF_profiler', true);

  function gfmt() {
    list($usec, $sec) = explode (www.php.net/explode)(' ', microtime (www.php.net/microtime)());
    return $usec + $sec;
  }

  function set_timer($mark) {
    global (www.php.net/global) $PM_TM;
    $PM_TM[$mark]['tm_point']=gfmt();
  }

  function get_timer($mark, $echoe=false) {
    $tmc = gfmt();
    global (www.php.net/global) $PM_TM;
    $PM_TM[$mark]['stat'][]=$tm=$tmc-$PM_TM[$mark]['tm_point'];
    if ($echoe) return round (www.php.net/round)($tm, 4);
  }

  function echo_profile() {
    global (www.php.net/global) $PM_TM;
    foreach ($PM_TM as $k=>$v)
      $echoe.= '<br><i>'.$k.'</i> <b>'.round(array_sum (www.php.net/array_sum)($v['stat']),4).'</b> секунд всего, за '.sizeof($v['stat']).' итераций<br>
                Среднее время итерации '
.round(array_sum (www.php.net/array_sum)($v['stat'])/sizeof (www.php.net/sizeof)($v['stat']),4).' секунд<br>';
    return $echoe;
  }
?>
Очень просто. Писал 5 минут - зато пользуюсь уже и не знаю сколько. На особую точность не претендует, но мне хватает(я обычно тяжёлые блоки замеряю, и|или многократно повторяющиеся). Как на мой взгляд - удобно. Комментировать не стал - думаю и так понятно будет.
Back to top
View user's profile Send private message Send e-mail
Дамир Хуснатдинов
Заглянувший



Joined: 31 Mar 2005
Posts: 8
Карма: 1
   поощрить/наказать

Location: Новосибирск

PostPosted: Wed Aug 17, 2005 8:55 am (спустя 19 часов 39 минут; написано за 11 секунд)
   Post subject:
Reply with quote

неужели профайлером сложнее пользоваться?
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML