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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Точность функции microtime(), Насколько точна эта функция? 
:(
    Опции темы
theworldcreator
Дата 12.7.2008, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Собственно проблема: пишу чат, существует скрипт, к которому каждые несколько секунд, через Ajax, обращается страница. В нем есть сессия(если еще нету, то создается), в которой метка time() предыдущего вызова этим пользователем. Дальше из БД берутся все сообщения с этой метки до момента сейчас, и этот момент сейчас, в свою очередь, записывается в сессию для следующего вызова.
Это была версия №1. Ее недостаток - если файл вызывался в начале секунды, то сообщения, добавленные в конце той же секунды не доходили до пользователя.
В следующий раз попробовал делать выборку до момента сейчас, НЕ включительно(то есть не " AND timestamp <='.$stime", а " AND timestamp <'.$stime").
Недостаток - зачастую приходиться очень долго ждать прихода сообщений. Сообщение уже пришло, но из за вышеописанной особенности не возвратилось вовремя и придется снова ждать таймера JS, вызывающего Ajax, снова ждать посылки запроса, ответа сервера....
Потом пришла в голову идея дождаться в PHP окончания текущей секунды, а потом сделать все тоже самое, как и в варианте №1. Но тут есть две проблемы: долго ждать ответа сервера, и я не знал загружает ли мой код ожидания сервер(если каждый вызов будет держать процессор загруженным по пол секунды никаких мощностей не хватит)
Поэтому решил попробовать с функцией microtime, как в варианте №3, дожидаться окончание текущий миллисекунды(этот способ лишен вышеописанных недостатков). Но это, разумеется, не сработает, если функция недостаточно точна(данная идея пришла в голову от того, что все говорят что профилер на ней точный невозможно построить)
Заранее спасибо за ответы, с уважением, Александр
PM MAIL WWW ICQ   Вверх
theworldcreator
Дата 12.7.2008, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код, вариант №3, для наглядности:
Код

$ctime = time();
if(empty($_SESSION['time_chat_update'])) $_SESSION['time_chat_update'] = 0;
while($ctime == time()){
    usleep(130);//добавлено, чтобы уменьшить нагрузку на процессор
}
$sql = 'select * from messages where mdate > '.$_SESSION['time_chat_update'].' AND mdate <= '.$ctime.' ORDER BY mdate DESC LIMIT 20';
$rs = mysql_query($sql);
while($r = mysql_fetch_array($rs)) {
    //заполнение массива сообщений
}
$_SESSION['time_chat_update'] = $ctime;


Это сообщение отредактировал(а) theworldcreator - 12.7.2008, 21:09
PM MAIL WWW ICQ   Вверх
MuToGeN
Дата 12.7.2008, 21:14 (ссылка) |   (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Лесник
****


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

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



Цитата(theworldcreator @  12.7.2008,  21:07 Найти цитируемый пост)
//добавлено, чтобы уменьшить нагрузку на процессор

Гениально. Вы случайно родом не из Индии?

Проблема, судя по всему, в кривизне структуры БД. Предлагаю выложить в этом топике полную ее схему.


--------------------
Three pings for the token rings,
Five pings for the UNIX machines,
Hundred pings for the broken links,
One special ping to check them all
Through Simple Network Management Protocol!
PM MAIL ICQ   Вверх
theworldcreator
Дата 12.7.2008, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MuToGeN @ 12.7.2008,  21:14)
Цитата(theworldcreator @  12.7.2008,  21:07 Найти цитируемый пост)
//добавлено, чтобы уменьшить нагрузку на процессор

Гениально. Вы случайно родом не из Индии?

Это промежуточный вариант,  все равно менять, и мысль двигалась в следующем направление: если пустые итерации цикла 100% займут процессор, то, скорей всего, встроенная функция откладывает продолжение выполнения скрипта, а не работает впустую. А поскольку этот вариант все равно промежуточный, реальное тестирование производительности было отложено до лучших времен.

Цитата
Проблема, судя по всему, в кривизне структуры БД. Предлагаю выложить в этом топике полную ее схему.


Изначально задача была такая: отдавать еще не прочитанные сообщения. Сразу пришли в голову две мысли: хранить где то список ID уже прочитанных(мне этот вариант показался очень ресурсоемким) или хранить где то время, по которое пользователь уже получил сообщения. Собственно здесь реализован второй вариант. Структура:
message    text
mdate    int(11)

Помимо этого есть еще несколько полей, но они сейчас никак не влияют.
PM MAIL WWW ICQ   Вверх
gibbzy
Дата 16.7.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



а мне вообще кажется что микротайм это весьма относительно ведь ещё скорость выполнения скрипта до микротайма какая ? тоже же миллисикунды.
PM MAIL WWW ICQ   Вверх
Fortop
Дата 16.7.2008, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



theworldcreator, 
Цитата(theworldcreator @  12.7.2008,  20:34 Найти цитируемый пост)
Дальше из БД берутся все сообщения с этой метки до момента сейчас, и этот момент сейчас, в свою очередь, записывается в сессию для следующего вызова.

Используй не метку времени, а ID последнего полученного сообщения.

Т.е. на текущий момет ты получил сообщения по ID = 100 включительно.
Значит в следующий раз ты должен получить все сообщения которые имеют ID > 100

Так будет гораздо устойчивее.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
theworldcreator
Дата 16.7.2008, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хм, а об этом я не подумал. Спасибо большое!
Но таким образом решается лишь эта конкретная задача. Все равно очень интересно, насколько точно она работает, и если достаточно, то почему все ругаются на нее, как на основу профилера?
PM MAIL WWW ICQ   Вверх
Feldmarschall
Дата 16.7.2008, 17:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


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

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



кто "все" и как именно "ругается"?
мало ли кто что скажет. глупостей говорят гораздо больше, чем умного. все опровергать времени не хватит

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


Опытный
**


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

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



Имхо проблема высосана из пальца. Неужели люфт в секунду так важен для обычного чата?


--------------------
Я Критик Джим, раньше писал моды для IPB 1.3.x-2.3.x, а теперь продвигаю Node.js в массы.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.3629 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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