![]() |
|
Модераторы: korob2001, ginnie |
![]()
|
|
| Vaneska |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 3 Всего: 4 |
Все стандартные функции Perl не возвращают время до долей секунд
А как этого добиться? Изучил реализацию сессий на PHP, предложенную Mal Hack`ом и решил на Perl`e модуль написать. Но в PHP доли секунд функция возвращает а в Perl`e нет. Помогите. --------------------
http://isokolov.blogspot.com/ |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Можно получить с помощью syscall, только на тех платформах, где она поддерживается. А можно заюзать модуль Time::HiRes. Сейчас проснусь немного и приведу пример. Если не секрет, объясни зачем для сессий нужны доли секунд????
-------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Vaneska |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 3 Всего: 4 |
Суть такая:
Прочитал я эту статью, вдохновился и сейчас пишу модуль управления сессиями(регистрации/авторизации). Так вот Mal Hack для генерации SID использует одним из параметров текущее время создания сесии до долей секунд. Система хороша тем, что не передает сам SID только имя пользователя и это текущее время. Вот поэтому так важны доли секунд! --------------------
http://isokolov.blogspot.com/ |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Насколько я понял, это нужно для уникальности. Я писал следующим образом: 1. Генерирую псевдо случайную строку цифр, например из 30 цифр. 2. Затем вычисляю текущее время, с помощью time() 3. Пишу подпрограмму, котой передаю 2 параметра, первый - наша слуйная строка цифр, второй текущее время. 4. В подпрограмме случайная строка разбивается на 2 части, а затем соединяется обратно, только в середину встявляется текущее время в секундах, с начала эпохи. 5. Вот эта строка чисел и возвращается. Как ты понимаешь, шансов на совпадение такого SID, практически нет и не нужно никаких стронних модулей и зависимостей от платформы. Пример приведу чуть позже, я уже напился. Это сообщение отредактировал(а) korob2001 - 5.5.2005, 19:09 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Вот пример, моего способа:
ВНИМАНИЕ!!!! Цикл закончится только в двух случаях: 1. Если закончится дисковое пространство. 2. Если SID повторится. ЗЫ: Уменя ещё никогда не повторился. О долях секунд, я обязательно напишу, просто я сейчас не дома. Перебежками подбегаю к компу. Удачи. Это сообщение отредактировал(а) korob2001 - 5.5.2005, 21:57 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| aleksnn |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 32 Регистрация: 27.4.2005 Репутация: 2 Всего: 2 |
Пока модератор недополз
Это был плагиат ;) |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Единственное, что хочу подправить:
Ему просто не нужно узнать время выполнения скрипта, это необходимо для уникальности SID. Но всё равно спасибо, если нужно узнать время выполнения, то проще воспользоваться times(). Это сообщение отредактировал(а) korob2001 - 6.5.2005, 11:28 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Vaneska |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 141 Регистрация: 15.3.2005 Где: Москва Репутация: 3 Всего: 4 |
Огромное спасибо!
Воспользуюсь твоим, korob2001, примером. Но по мимо этого в SID всетаки нужно довавить и IP и UserAgent. Будет более надежно. И потом для статистики полезно. Как закончу модуль, отдам на тестирование, если вы не против. Это мой первый серьезный модуль. Надо будет его как следует сделать. Но опыта у меня моловато. Буду надеется на вашу помощь. --------------------
http://isokolov.blogspot.com/ |
|||
|
||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Думаю никто против не будет, нет ничего плохого когда человек пытается создать что-то своё, такие идеи только поддерживаются. Главное желание и терпение и всё у тебя получится. Удачи тебе Это сообщение отредактировал(а) korob2001 - 7.5.2005, 03:52 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Usya |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 7.6.2005 Репутация: нет Всего: нет |
Чтобы не плодить темы решил написать здесь.
Как раз это мне и нужно, только не пойму принцип работы. Вот простенький пример, но почему-то он выводит одно и тоже время.
0.015:0.031:0:0 0.015:0.031:0:0 0.015:0.031:0:0 Заранее благодарен за посильную помощь. --------------------
Я не волшебник, я только учусь... |
||||
|
|||||
| korob2001 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
Usya - проблема в том, что у тебя times() используется в списковом контексте. Она возвращает общее время в течении которого пользователь и сисстема занимали центральный процессор. Ты можешь один раз получить данные в списковом контексте и получишь время работы программы:
Если тебе нужно узнать, сколько отработала часть кода, тогда юзай times в скалярном контексте. Это сообщение отредактировал(а) korob2001 - 2.11.2005, 20:37 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
|||
|
||||
| Usya |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 7.6.2005 Репутация: нет Всего: нет |
Спасибо, но я так и не смог получить того, что хотел
1) Код
выдает 0.234:0.015:0:0 0.484:0.015:0:0 0.718:0.015:0:0 Так что скалярный контекст похоже тут не причем... Результат и в списковом изменяется. 2) sleep-относится к системному времени или пользовательскому и почему ни то, ни другое не зависит от sleep? Даже простой код
Выдает 0.015:0.015:0:0 --------------------
Я не волшебник, я только учусь... |
||||
|
|||||
| sharq |
|
||||||||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Usya
perldoc -f sleep
Ну правильно, ты сначала засыпаешь, а потом выдаешь время. Зачем ты используешь times, используй Time::HiRes::time - очень удобно.
Ты разве использовал скалярный контекст? Скалярный контекст - это либо
либо
-------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||||||||
|
|||||||||||
| Usya |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 7.6.2005 Репутация: нет Всего: нет |
sharq
Нет, так я и не говорю про это. Просто korob2001 написал, что
а здесь по ходу дела и в списковом изменяется.
Вот здесь, если не трудно, немножко поподробнее. 1) Может мой "великий" английский дает о себе знать, но я там не нашел ответа на свой вопрос. 2) По-моему логично. Проспав две секунды скрипт должен мне выдать, сколько времени прошло с момента запуска. Я же не наоборот написал. 3) Если с этим не получится, тогда попробую, а пока хочется разобраться в чем загвоздка. --------------------
Я не волшебник, я только учусь... |
||||||
|
|||||||
| Usya |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 7.6.2005 Репутация: нет Всего: нет |
--------------------
Я не волшебник, я только учусь... |
|||
|
||||
| korob2001 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2871 Регистрация: 29.12.2002 Репутация: 31 Всего: 61 |
А что именно не понятно?
Если тебе нужно вычислить время работы отдельного участка программы, то используй Benchmark:
Если нужны доли секунд, TimeHiRes. А вот что написано в "Программирование на Perl", по поводу times()
Это сообщение отредактировал(а) korob2001 - 8.11.2005, 00:55 -------------------- "Время проходит", - привыкли говорить вы по неверному пониманию. "Время стоит - проходите вы". |
||||
|
|||||
| Usya |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 7.6.2005 Репутация: нет Всего: нет |
Мне хотелось бы отдельно получить системное и пользовательское время. times() позволяет это делать, но почему некорректно работает вышеприведенный код?
На выходе имеем 0.234:0.015:0:0 0.484:0.015:0:0 0.718:0.015:0:0 Почему не учитывается sleep(1)? И что вообще учитывается, а что нет??? А вопрос возник в связи со следующей проблемой. Если не вдаваться в подробности, то можно сказать так - в одном из своих скриптов я написал
На выходе получаю ... Время генерации скрипта: 1.89:0.07:0:0 сек Время генерации скрипта: 7 сек ... либо что-то в этом роде. Никаких sleep-ов у меня правда нет, но в чем проблема в такой разнице понять не могу... --------------------
Я не волшебник, я только учусь... |
||||
|
|||||
| sharq |
|
||||||
![]() Perl Liker ![]() ![]() Профиль Группа: Участник Сообщений: 841 Регистрация: 13.12.2004 Где: Ростов-на-Дону Репутация: 23 Всего: 28 |
Если ты не правильно поставил постфикс у числа это не значит, что скрипт не правильно работает! Все правильно отработало, всего за 0.07 секунд. И ни какой разницы нет. Функция times, точнее ее второй элемент в списке выдает системное время отработки скрипта, а не время отработка в текущий момент, поэтому хаваются три твоих слипа и только потом печатается одно и тоже время. В этом случаю нужно использовать функцию time! И зачем делать слип и цикл, который по своей сути делает слип? Надеюсь, поймешь, в чем смысл на этом примере.
Это сообщение отредактировал(а) sharq - 8.11.2005, 20:26 -------------------- [color=gray]There's More Than One Way To Do It[/color] |
||||||
|
|||||||
| Usya |
|
||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 7.6.2005 Репутация: нет Всего: нет |
Кажется начал разбираться!!!!!!!!!!!!! Правда не все пока еще гладко. В отношении результатов последнего кода - если неправильно, поправьте 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 не подойдет. sharq Я не совсем понял некоторые утверждения
В своем скрипте, когда приводил пример, я не использовал Time::HiRes и время time(), соответственно, измерялось в секундах. При этом это и есть фактическое время выполнения скрипта (при запуске оно прыгало от 2-х и до 8 сек), 0.07 получается - это только системное время. Кстати, что ты имел в виду под постфиксом? С этим я сталкивался только у декремента и инкремента.
Этот пример можно трактовать по-разному. Поясни в двух словах, что именно ты хотел показать? Да и еще, sleep в своем коде поставил, чтоб показать, что от него ничего не зависит... А на счет системного времени ты скорее всего прав. Пользовательское изменяется, а системное нет и не важно в списковом контексте выводятся данные или в скалярном. --------------------
Я не волшебник, я только учусь... |
||||||
|
|||||||
| Kiber_rat |
|
||||
![]() MACMANIAC ![]() ![]() Профиль Группа: Участник Сообщений: 276 Регистрация: 18.4.2002 Где: Ashdod, Israel Репутация: 7 Всего: 9 |
Хочу обратить внимание на одни спрятанные в траве грабли
А пока скриптик будет "спать" переведите системное время на полчасика вперед. Дополнительно хочу заметить что на многих серверах коррекция системного времени производится автоматически через timeservers по крону, так что вопрос о том насколько вероятно изменение системного времени не стоит. Возможно для сессий это окажется не критично, но знать о такой "фиче" не вредно Вот уже после написания узнал, что наши списались с разработчиком модуля Time::HiRes и он добавил в следующую версию дополнительную функцию clock_gettime() которая, будучи вызвана с константой CLOCK_MONOTONIC, вернет правильный интервал Это сообщение отредактировал(а) Kiber_rat - 9.11.2005, 01:10 -------------------- Best regards! @..@_____Ku6ep =*=______\______KPbIC
|
||||
|
|||||
| Usya |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 7.6.2005 Репутация: нет Всего: нет |
По ходу дела больше идей не будет...
Впрочем пока можно немного остановиться на достигнутом Спасибо всем откликнувшимся за инфу и советы!!! --------------------
Я не волшебник, я только учусь... |
|||
|
||||
![]()
|
| Правила форума "Perl" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |