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

Поиск:

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


Шустрый
*


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

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



Все стандартные функции Perl не возвращают время до долей секунд smile
А как этого добиться?
Изучил реализацию сессий на PHP, предложенную Mal Hack`ом и решил на Perl`e модуль написать. Но в PHP доли секунд функция возвращает а в Perl`e нет.
Помогите. smile
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 5.5.2005, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Можно получить с помощью syscall, только на тех платформах, где она поддерживается. А можно заюзать модуль Time::HiRes. Сейчас проснусь немного и приведу пример. Если не секрет, объясни зачем для сессий нужны доли секунд????


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


Шустрый
*


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

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



Суть такая:
Прочитал я эту статью, вдохновился и сейчас пишу модуль управления сессиями(регистрации/авторизации). Так вот Mal Hack для генерации SID использует одним из параметров текущее время создания сесии до долей секунд. Система хороша тем, что не передает сам SID только имя пользователя и это текущее время.

Вот поэтому так важны доли секунд!
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 5.5.2005, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

getmicrotime(); - возвращает время с дробными частями секунды (нужно для получения уникального времени регистрации).

Насколько я понял, это нужно для уникальности. Я писал следующим образом:
1. Генерирую псевдо случайную строку цифр, например из 30 цифр.
2. Затем вычисляю текущее время, с помощью time()
3. Пишу подпрограмму, котой передаю 2 параметра, первый - наша слуйная строка цифр, второй текущее время.
4. В подпрограмме случайная строка разбивается на 2 части, а затем соединяется обратно, только в середину встявляется текущее время в секундах, с начала эпохи.
5. Вот эта строка чисел и возвращается.

Как ты понимаешь, шансов на совпадение такого SID, практически нет и не нужно никаких стронних модулей и зависимостей от платформы. Пример приведу чуть позже, я уже напился. smile

Это сообщение отредактировал(а) korob2001 - 5.5.2005, 19:09


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


Эксперт
****


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

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



Вот пример, моего способа:
Код

#!/usr/bin/perl -w
use strict;

my($sid, %dbm ) = ();

sub gen_str {
    my $col = shift || 40;
    my @nums = ( 0..9 );
    my $str = join("", @nums[ map { rand @nums }( 1..$col ) ] );
    return $str;
}

sub unique_sid {
    my $str = shift || gen_str();
    my $tm  = shift || time();
    my $mid = length( $str ) / 2;
    $str = substr( $str, 0, $mid ) . $tm . substr( $str, $mid );
    return $str;
}

dbmopen( %dbm, "mydbm", 0644 ) or die $!;
while ( 1 ) {
    $sid = unique_sid();
    print "$sid\n";
    last if exists( $dbm{ $sid } );
    $dbm{ $sid } = 0;
}
dbmclose( %dbm );

print "Повторился ID: $sid\n";

ВНИМАНИЕ!!!!
Цикл закончится только в двух случаях:
1. Если закончится дисковое пространство.
2. Если SID повторится.

ЗЫ: Уменя ещё никогда не повторился.
О долях секунд, я обязательно напишу, просто я сейчас не дома. Перебежками подбегаю к компу. smile

Удачи.

Это сообщение отредактировал(а) korob2001 - 5.5.2005, 21:57


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


Новичок



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

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



Пока модератор недополз smile
Код

use Time::HiRes qw(time);  
  
my $time = Time::HiRes::time;  
 
# код на выполнение 
 
my $time1 = Time::HiRes::time - $time;  
print "Время выполнения скрипта: $time1";  

Это был плагиат ;)
PM MAIL   Вверх
korob2001
Дата 6.5.2005, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Единственное, что хочу подправить:
Код

#!/usr/bin/perl -w
use strict;
use Time::HiRes qw(time);

my $time = Time::HiRes::time;

print $time;

Ему просто не нужно узнать время выполнения скрипта, это необходимо для уникальности SID. Но всё равно спасибо, если нужно узнать время выполнения, то проще воспользоваться times().

Это сообщение отредактировал(а) korob2001 - 6.5.2005, 11:28


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


Шустрый
*


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

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



Огромное спасибо!
Воспользуюсь твоим, korob2001, примером.
Но по мимо этого в SID всетаки нужно довавить и IP и UserAgent.
Будет более надежно. И потом для статистики полезно.

Как закончу модуль, отдам на тестирование, если вы не против.
Это мой первый серьезный модуль. Надо будет его как следует сделать. Но опыта у меня моловато.
Буду надеется на вашу помощь.
--------------------
http://isokolov.blogspot.com/
PM MAIL ICQ   Вверх
korob2001
Дата 7.5.2005, 03:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата

Как закончу модуль, отдам на тестирование, если вы не против.

Думаю никто против не будет, нет ничего плохого когда человек пытается создать что-то своё, такие идеи только поддерживаются. Главное желание и терпение и всё у тебя получится.
Удачи тебе smile

Это сообщение отредактировал(а) korob2001 - 7.5.2005, 03:52


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


Бывалый
*


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

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



Чтобы не плодить темы решил написать здесь.

Цитата
если нужно узнать время выполнения, то проще воспользоваться times()


Как раз это мне и нужно, только не пойму принцип работы.
Вот простенький пример, но почему-то он выводит одно и тоже время.

Код

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


0.015:0.031:0:0
0.015:0.031:0:0
0.015:0.031:0:0

Заранее благодарен за посильную помощь.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
korob2001
Дата 2.11.2005, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Usya - проблема в том, что у тебя times() используется в списковом контексте. Она возвращает общее время в течении которого пользователь и сисстема занимали центральный процессор. Ты можешь один раз получить данные в списковом контексте и получишь время работы программы:
Код

#!/usr/bin/perl -w
use strict;
my $work = 10000000;

while ( $work > 0 ) {
        --$work;
}

printf ("Пользователь процесс и его потомки занимали CPU: %0.3f сек.", (map {$work += $_} ( times )  ) );

Если тебе нужно узнать, сколько отработала часть кода, тогда юзай times в скалярном контексте.

Это сообщение отредактировал(а) korob2001 - 2.11.2005, 20:37


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


Бывалый
*


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

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



Спасибо, но я так и не смог получить того, что хотел

1) Код
Код

#!/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
Так что скалярный контекст похоже тут не причем... Результат и в списковом изменяется.

2) sleep-относится к системному времени или пользовательскому и почему ни то, ни другое не зависит от sleep?
Даже простой код
Код

#!/usr/bin/perl
sleep(2);
print join(':',times),"\n";

Выдает
0.015:0.015:0:0
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
sharq
Дата 4.11.2005, 11:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Perl Liker
**


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

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



Usya
Цитата(Usya @ 3.11.2005, 20:35)
sleep-относится к системному времени или пользовательскому и почему ни то, ни другое не зависит от sleep?

perldoc -f sleep

Цитата

Даже простой код
#!/usr/bin/perl
sleep(2);
print join(':',times),"\n";

Выдает
0.015:0.015:0:0


Ну правильно, ты сначала засыпаешь, а потом выдаешь время.
Зачем ты используешь times, используй Time::HiRes::time - очень удобно.


Цитата(Usya @ 3.11.2005, 20:35)
Так что скалярный контекст похоже тут не причем

Ты разве использовал скалярный контекст?
Скалярный контекст - это либо
Код

print times;

либо
Код

print scalar times;


smile



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


Бывалый
*


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

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



sharq

Цитата
Ты разве использовал скалярный контекст?

Нет, так я и не говорю про это. Просто korob2001 написал, что
Цитата
Ты можешь один раз получить данные в списковом контексте и получишь время работы программы

а здесь по ходу дела и в списковом изменяется.

Цитата
1) perldoc -f sleep
2) Ну правильно, ты сначала засыпаешь, а потом выдаешь время.
3) Зачем ты используешь times, используй Time::HiRes::time - очень удобно.


Вот здесь, если не трудно, немножко поподробнее.
1) Может мой "великий" английский дает о себе знать, но я там не нашел ответа на свой вопрос.
2) По-моему логично. Проспав две секунды скрипт должен мне выдать, сколько времени прошло с момента запуска. Я же не наоборот написал.
3) Если с этим не получится, тогда попробую, а пока хочется разобраться в чем загвоздка.
--------------------
Я не волшебник, я только учусь...
PM MAIL   Вверх
Usya
Дата 7.11.2005, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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.0554 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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