Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разница двух дат, Нестабильность функции microtime(); 
:(
    Опции темы
semnt
Дата 6.11.2005, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Offtop: Как же надоело, что теоретические способы решения задач, рассматриваемые в литературе, не имеют реальной силы при реализации на практике smile Всегда приходится наворачивать алгоритм своими собственными фишками, которые не дают ошибаться "стандартным" функциям...

Простая задача. Необходимо измерить время, прошедшее с какого-то предыдущего момента с точностью до миллисекунды.
Используем функцию microtime();
Функция microtime() возвращает строку. В строке два числа разделённые пробелом. Второе число - кол-во секунд, прошедших с начало эпохи (00:00:00 01.01,1970). Первое число - кол-во миллисекунд, прошедших с начала секунды (первое число).
Создаём функцию now(), которая будет возвращать одно число (дата на данный момент: секунды+миллисекунды).
Код

function now() {
  $time=explode(" ",microtime());
  return $time[0]+$time[1];
}

Всё отлично. Проверяем как она будет работать.
Код

for($i=0;$i<1000;$i++) { //1000 действий для проверки стабильности.
  $time1=now(); //Начальная точка
    //Какое либо действие----
  $array=range(0,1000);
  shuffle($array);

  $time2=now(); //Конечная точка
    //Здесь уже знаем о нестабильности. Показываем что она действительно есть.
  if ($time2<$time1) {
    echo "Ошибка в действии $i. time2=".$time2."; time1=".$time1."; time2-time1=".($time2-$time1)." - число отрицательное!!<br>";
  }
}

Объясняю. Ошибкой считается ситуация, когда результат функции microtime() в определённый момент времени меньше, чем результат этой же функции, но в предыдущий момент времени.
У меня получается примерно 10 действий с ошибкой на все 1000 действий.

Что? Почему? Как заставить работать нормально??....
PM MAIL   Вверх
AztEK
Дата 6.11.2005, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ХМ...А у меня всё работатет.
Apache 1.3.1 + PHP 4.3.10


--------------------
Linux is like wigwam -- no windows, no gates, apache inside.
PM MAIL Jabber   Вверх
Mal Hack
Дата 6.11.2005, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Код

 function getmicrotime()
  {
   $mt = explode( " ", microtime() );
   return ( (float)$mt[0] + (float)$mt[1] );
  }

 $time_start = getmicrotime();

  $array=range(0,1000);
  shuffle($array);

 $time_end = getmicrotime();
 $test = $time_end - $time_start;

 print "<br><br>Script works " . round( $test , 4 ) . " seconds<br><br>";
 flush();

?>



Цитата(semnt @ 6.11.2005, 01:07)
В строке два числа разделённые пробелом. Второе число - кол-во секунд, прошедших с начало эпохи (00:00:00 01.01,1970). Первое число - кол-во миллисекунд, прошедших с начала секунды (первое число).

Неа.
Цитата
returns the current Unix timestamp with microseconds

Первая ьполовина - секунды с 1970, вторая - милисекунды текущей секунды.
PM ICQ   Вверх
semnt
Дата 7.11.2005, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата
Первая ьполовина - секунды с 1970, вторая - милисекунды текущей секунды.

Превда?)
echo microtime(); //И ясно, что наоборот)

Загрузил свой пример на хост (Apache/1.3.33. PHP Version 4.3.11). Вроде работает без ошибок.
А на локальной машине не хочет(Apache/1.3.19. PHP Version 4.0.4pl1). Может дело в том, что на локальной машине стоит Windows.
Вобщем непонятно.
PM MAIL   Вверх
Mal Hack
Дата 7.11.2005, 02:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(semnt @ 7.11.2005, 01:18)
echo microtime(); //И ясно, что наоборот)

Так, да... Ступил.

Цитата(semnt @ 7.11.2005, 01:18)
А на локальной машине не хочет(Apache/1.3.19. PHP Version 4.0.4pl1). Может дело в том, что на локальной машине стоит Windows.

Проверил на винде, все нормально.
У тебя конечно версия PHP старая очень, что не есть хорошо.

Подумай на счет вот этого. Условие всегда ложно !!
Цитата(semnt @ 6.11.2005, 01:07)
  if ($time2<$time1) {


PM ICQ   Вверх
semnt
Дата 7.11.2005, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Понятно... видимо php действительно уже стар)
Цитата
Подумай на счет вот этого. Условие всегда ложно !!

Ну да... я и проверял скрипт на стабильность этим условием.
PM MAIL   Вверх
Mal Hack
Дата 7.11.2005, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


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

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



Цитата(semnt @ 7.11.2005, 13:46)
Ну да... я и проверял скрипт на стабильность этим условием.

Это же в теории невозможно smile))
PM ICQ   Вверх
kat_ru
Дата 7.3.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Другого не будет



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 16.1.2007
Где: Moscow City

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



У меня иногда вот такой результат получается это что? 
Цитата

9.9897384643555E-5

PM MAIL   Вверх
Feldmarschall
Дата 7.3.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



PM   Вверх
CyClon
Дата 7.3.2008, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



kat_ru, ~9.9 в степени -5.


--------------------
user posted image
PM   Вверх
SelenIT
Дата 7.3.2008, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

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



CyClon, не совсем ;)

kat_ru, это 0.000099897384643555


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Serkys
Дата 8.3.2008, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1061
Регистрация: 19.4.2004

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



Позволю себе напомнить вам, что начиная с PHP5 в функцию microtime() можно передать true и мы получим float, а не непонятно зачем созданный формат "микросекунды-пробел-секунды".

Никто не подскажет, зачем был нужен такой странный формат?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

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


 




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


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

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