Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как получить доли секунды 
:(
    Опции темы
korob2001
Дата 8.11.2005, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2871
Регистрация: 29.12.2002

Репутация: 31
Всего: 61



А что именно не понятно?
Если тебе нужно вычислить время работы отдельного участка программы, то используй Benchmark:
Код

#!/usr/bin/perl -w
use strict;
use Benchmark;
my $start = new Benchmark;
my $r = 0;

go();
sub go {
    for ( 1..100000 ) {

        $r += 1;
        print $r, "\n";
    }
}

my $res = timediff( new Benchmark, $start );
print "Cicle work " . timestr( $res ) . ".";

Если нужны доли секунд, TimeHiRes.

А вот что написано в "Программирование на Perl", по поводу times()
Цитата

В списковом контексте эта функция возвращает список из четырёх элементов, которые дают время в секундах ( возможно, дробное ), в течении которого пользователь и система занимали CPU, для данного процесса и его завершившихся дочерних процессов.

($user, $system, $cuser, $csystem) = times();
printf "Данный pid и его потомки использовали %.3f секунд\n", $user + $system + $cuser + $csystem;

В скалярном контексте функция возвращает просто время работы пользователя. Например, для измерения времени выполнения фрагмента кода Perl:

$start = times();
...
$end = times();
printf "Это заняло %.2f секунд использования CPU\n", $end - $start;


Это сообщение отредактировал(а) korob2001 - 8.11.2005, 00:55


--------------------
"Время проходит", - привыкли говорить вы по неверному пониманию. 
"Время стоит - проходите вы".
PM MAIL WWW ICQ MSN   Вверх
Usya
Дата 8.11.2005, 18:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



Мне хотелось бы отдельно получить системное и пользовательское время. times() позволяет это делать, но почему некорректно работает вышеприведенный код?
Код

#!/usr/bin/perl
for ($i=0;$i<3;$i++)
  {
    sleep(1);
    $work = 1000000; while ( $work > 0 ) {$work--;}
    print join(':',times),"\n";
  }

На выходе имеем
0.234:0.015:0:0
0.484:0.015:0:0
0.718:0.015:0:0
Почему не учитывается sleep(1)? И что вообще учитывается, а что нет???

А вопрос возник в связи со следующей проблемой. Если не вдаваться в подробности, то можно сказать так - в одном из своих скриптов я написал
Код

...
print '<p class=txtc> Время генерации скрипта: '.(join(':',times)).' сек</p>';
print '<p class=txtc> Время генерации скрипта: '.(time-$start).' сек</p>';
...

На выходе получаю
...
Время генерации скрипта: 1.89:0.07:0:0 сек
Время генерации скрипта: 7 сек
...
либо что-то в этом роде.

Никаких sleep-ов у меня правда нет, но в чем проблема в такой разнице понять не могу...


--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
sharq
Дата 8.11.2005, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 13.12.2004
Где: Ростов-на-Дону

Репутация: 23
Всего: 28



Цитата(Usya @ 8.11.2005, 19:48)
Время генерации скрипта: 1.89:0.07:0:0 сек
Время генерации скрипта: 7 сек

Если ты не правильно поставил постфикс у числа это не значит, что скрипт не правильно работает!

Все правильно отработало, всего за 0.07 секунд. И ни какой разницы нет.

Функция times, точнее ее второй элемент в списке выдает системное время отработки скрипта, а не время отработка в текущий момент, поэтому хаваются три твоих слипа и только потом печатается одно и тоже время. В этом случаю нужно использовать функцию time!

И зачем делать слип и цикл, который по своей сути делает слип?


Надеюсь, поймешь, в чем смысл на этом примере.

Код

use Time::HiRes 'time';

my $start = time();

foreach (1..3) {
    1 foreach 1..1000;
    print "Time:  ", sprintf("%f", time()-$start), "\n";
    print "Times: ", join(':',times),"\n";
}


Код

Time:  0.004911
Times: 0.093:0.015:0:0
Time:  0.005261
Times: 0.093:0.015:0:0
Time:  0.005452
Times: 0.093:0.015:0:0


smile

Это сообщение отредактировал(а) sharq - 8.11.2005, 20:26


--------------------
[color=gray]There's More Than One Way To Do It[/color]
PM MAIL WWW ICQ Skype   Вверх
Usya
Дата 8.11.2005, 23:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



smile

Кажется начал разбираться!!!!!!!!!!!!!
Правда не все пока еще гладко. В отношении результатов последнего кода - если неправильно, поправьте
1) 1.89 сек - пользовательское время
2) 0.07 сек - системное время
3) 7 сек - фактическое время
4) время у sleep (в тестовом примере) возможно не относится ни к пользовательскому ни к системному, хотя с этим еще не до конца разобрался. Возможно я не прав.

Фактическое время не всегда равно пользовательскому + системному http://www.regatta.cs.msu.su/doc/usr/share...ngd/2365c62.htm, поэтому korob2001
Цитата
если нужно узнать время выполнения, то проще воспользоваться times()

times() подойдет только сравнения времени работы скриптов (например при оптимизации кода) или для оценки времени работы так сказать в идеале в однопроцессорной системе. Для оценки фактического времени times не подойдет.

sharq
Я не совсем понял некоторые утверждения

Цитата
Если ты не правильно поставил постфикс у числа это не значит, что скрипт не правильно работает!
Все правильно отработало, всего за 0.07 секунд. И ни какой разницы нет.

В своем скрипте, когда приводил пример, я не использовал Time::HiRes и время time(), соответственно, измерялось в секундах. При этом это и есть фактическое время выполнения скрипта (при запуске оно прыгало от 2-х и до 8 сек), 0.07 получается - это только системное время.
Кстати, что ты имел в виду под постфиксом? С этим я сталкивался только у декремента и инкремента.

Цитата
Надеюсь, поймешь, в чем смысл на этом примере.

Этот пример можно трактовать по-разному. Поясни в двух словах, что именно ты хотел показать?

Да и еще, sleep в своем коде поставил, чтоб показать, что от него ничего не зависит...
А на счет системного времени ты скорее всего прав. Пользовательское изменяется, а системное нет и не важно в списковом контексте выводятся данные или в скалярном.

--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Kiber_rat
Дата 9.11.2005, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MACMANIAC
**


Профиль
Группа: Участник
Сообщений: 276
Регистрация: 18.4.2002
Где: Ashdod, Israel

Репутация: 7
Всего: 9



Хочу обратить внимание на одни спрятанные в траве грабли smile Мы на них случайно наткнулись в своем проекте. Грабли касаются функции time и модуля Time::HiRes в частности, суть их в том, что этот модуль ориентируется на стандартное юниксовское время, т.е. на количество секунд (микросекунд) прошедших с 1970 года (дату не помню, по моему 1-е января). Дык вот, можете проверить. Напишите простенький скрипт в котором меряется и выводится интревал времени, например:
Код

use strict;
use warnings;
use Time::HiRes qw( time );
print "Start: ",time(),"\n";
sleep 30;
print "Finish: ",time(),"\n";

А пока скриптик будет "спать" переведите системное время на полчасика вперед. Дополнительно хочу заметить что на многих серверах коррекция системного времени производится автоматически через timeservers по крону, так что вопрос о том насколько вероятно изменение системного времени не стоит. Возможно для сессий это окажется не критично, но знать о такой "фиче" не вредно smile
Вот уже после написания узнал, что наши списались с разработчиком модуля Time::HiRes и он добавил в следующую версию дополнительную функцию clock_gettime() которая, будучи вызвана с константой CLOCK_MONOTONIC, вернет правильный интервал smile

Это сообщение отредактировал(а) Kiber_rat - 9.11.2005, 01:10


--------------------
Best regards!                                                             
@..@_____Ku6ep
=*=______\______KPbIC
Код
print join "",map{chr}(split/(\w{2})/,hex(int(2175.57302796298**2)))
PM WWW ICQ Skype Jabber YIM   Вверх
Usya
Дата 12.11.2005, 05:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 154
Регистрация: 7.6.2005

Репутация: нет
Всего: нет



По ходу дела больше идей не будет...
Впрочем пока можно немного остановиться на достигнутом smile
Спасибо всем откликнувшимся за инфу и советы!!!
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.