Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

getmicrotime() возвращает странные результаты[PHP]

312
04 октября 2008 года
dead_star
392 / / 26.11.2006
Код:
function getmicrotime(){
 list($usec, $sec) = explode(" ",microtime());
 return ($usec + $sec);
}

$s = getmicrotime();
echo round((getmicrotime()-$s),10)."<br />\n";
$s = getmicrotime();
echo round((getmicrotime()-$s),10)."<br />\n";
$s = getmicrotime();
echo round((getmicrotime()-$s),10)."<br />\n";

функция которая трижды вызывается и печатает результат
 
Код:
6.81877E-5
9.0599E-6
6.1989E-6

как видно из примера, первое число значительно больше остальных. резонный вопрос, почему?
312
04 октября 2008 года
dead_star
392 / / 26.11.2006
все тоже самое, но без round() и среднее за 10 000 итераций
 
Код:
5.2953481674194E-6
5.0875663757324E-6
5.0863027572632E-6
5.0837993621826E-6
244
05 октября 2008 года
UAS
2.0K / / 19.07.2006
Вполне нормальные результаты)) Займемся математикой))
Обозначим:
($usec1 + $sec1) = getmicrotime() который в round
($usec2 + $sec2) = $s = getmicrotime();

Соответственно если $usec1 == $usec2, т.е. замеры сделаны в одну секунду, то их разница равна нулю, тогда выводится на экран только $sec1 - $sec2, что и дает E-6. Если же $usec1 > $usec2, т.е. замер $sec1 произошел на след. секунде, то тогда перед значением ($sec1 - $sec2) появиться одна ведущая цифра, так как $usec1 и $usec2 различны на разряд. От этого, соответсвенно, и появляется ваша E-5, так как теперь число имеет только 5 нулей после точки, а не 6, когда замеры идут в одну секунду.

ЗЫ: а ещё, заместо этой getmicrotime() используйте microtime(true) - результат тот же (если php>=5)
312
06 октября 2008 года
dead_star
392 / / 26.11.2006
Цитата: UAS
Вполне нормальные результаты)) Займемся математикой))
Обозначим:
($usec1 + $sec1) = getmicrotime() который в round
($usec2 + $sec2) = $s = getmicrotime();

Соответственно если $usec1 == $usec2, т.е. замеры сделаны в одну секунду, то их разница равна нулю, тогда выводится на экран только $sec1 - $sec2, что и дает E-6. Если же $usec1 > $usec2, т.е. замер $sec1 произошел на след. секунде, то тогда перед значением ($sec1 - $sec2) появиться одна ведущая цифра, так как $usec1 и $usec2 различны на разряд. От этого, соответсвенно, и появляется ваша E-5, так как теперь число имеет только 5 нулей после точки, а не 6, когда замеры идут в одну секунду.


хуйню сказал(без обид)
я тебя конечно уважаю, много умных мыслей высказал,
но в данном вопросе ты по моему слегка запутался
определения недостаточно корректные и выводы нелогичные
исходя из твоих выводов все последующие вызовы дают меньший результат относительно предыдущего в геометрической прогрессии
в деталях

Цитата: UAS
$usec1 == $usec2


невозможно по определению

Цитата: UAS
$usec1 > $usec2


про это вообще говорить нечего, $usec2 всегда больше $usec1

Цитата: UAS

ЗЫ: а ещё, заместо этой getmicrotime() используйте microtime(true) - результат тот же (если php>=5)


это все конечно замечательно, я давно знаю об этом функционале, но есть одна давно известная проблема, что не все перешли даже на 4 php так что о 5 и говорить нечего. это факт и оспаривать его нет смысла. а при написании приложений стоит все таки задумываться о поддержке ограниченными системными ресурсами

312
06 октября 2008 года
dead_star
392 / / 26.11.2006
UAS высказал мнение что вся причина сводится к математическим действиям, я несогласен с этим убеждением.
у меня есть определенная теория на данный счет
на тему затрат системных ресурсов
я предполагаю что причина именно в первичном обращении к функции
чисто в теории на ее месте может быть любая другая функция
при первичном обращении к функции интерпретатор единожды выполняет код и при повторном обращении к этому же коду он загружает данные из памяти, а не вновь интерпретирует данные, и выполняет их
поскольку данные были загружены из памяти на их выполнение требуется меньше ресурсов, что объясняет последующее выполнение этой же программы за меньшее время

PS мне не довелось полноценно протестировать свою теорию, но я полагаю что она вера
353
07 октября 2008 года
Nixus
840 / / 04.01.2007
Дело в выделении памяти.
244
07 октября 2008 года
UAS
2.0K / / 19.07.2006
Хмм ну не знаю, может где-то и тут косяк.. Я по крайней мере так считал всегда %)

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

Хотя, конечно, разговор тут не об этом
92
07 октября 2008 года
Тень Пса
2.2K / / 19.10.2006
Цитата: dead_star
но есть одна давно известная проблема, что не все перешли даже на 4 php так что о 5 и говорить нечего. это факт и оспаривать его нет смысла. а при написании приложений стоит все таки задумываться о поддержке ограниченными системными ресурсами



[quote="PHP.net"]
[07-Aug-2008] The PHP development team would like to announce the immediate availability of PHP 4.4.9. It continues to improve the security and the stability of the 4.4 branch and all users are strongly encouraged to upgrade to it as soon as possible. This release wraps up all the outstanding patches for the PHP 4.4 series, and is therefore the [SIZE=3] last PHP 4.4[/SIZE] release.
[/quote]
ты о чем?? как "не перешли на 4й"... это, глупость, имхо. ибо сколько можно думать о тех, у кого еще 95я винда и IE 4й версии.... да + ко всему еще и монитор 14" CRT с защитным экранов в виде навесного стёклышка и Pentium I - 133 Mhz :)))))



ps: и еще... не дерзи :) здесь форум, а не двор, где можно постоять, поплевать и поматюкаться ;)

312
07 октября 2008 года
dead_star
392 / / 26.11.2006
Цитата: Тень Пса
ты о чем?? как "не перешли на 4й"... это, глупость, имхо. ибо сколько можно думать о тех, у кого еще 95я винда и IE 4й версии.... да + ко всему еще и монитор 14" CRT с защитным экранов в виде навесного стёклышка и Pentium I - 133 Mhz :)))))


собственно пару месяцев назад, кто-то из отцов говорил что натыкался на хостер где php 3 стоял
да и среди моих знакомых хостеров у некоторых 4 php стоит по умалчании

Цитата: Тень Пса
ps: и еще... не дерзи :) здесь форум, а не двор, где можно постоять, поплевать и поматюкаться ;)


здорово. я надрываюсь, ломаю голову чтобы подобрать наиболее корректные слова, а он мне не дерзи :(

244
07 октября 2008 года
UAS
2.0K / / 19.07.2006
Цитата: dead_star
собственно пару месяцев назад, кто-то из отцов говорил что натыкался на хостер где php 3 стоял
да и среди моих знакомых хостеров у некоторых 4 php стоит по умалчании


Не знаю, что за хостер, везде, где я размещал клиентов - поодерживается неплохо пхп5. А на 4 вообще не вижу смысла писать. Может - просто пережиток прошлого, что он стоит, или просто что масса людей, начинающих изучать пхп, пишут только на 4, не используя пхп5, ну и ещё, что большинство движков написаны. Вот потому, вероятно, он ещё используется

312
08 октября 2008 года
dead_star
392 / / 26.11.2006
на тему новых версий сразу вспоминается "windows vista" и "qip infium"
92
08 октября 2008 года
Тень Пса
2.2K / / 19.10.2006
Цитата: dead_star
здорово. я надрываюсь, ломаю голову чтобы подобрать наиболее корректные слова, а он мне не дерзи :(


это типа мне одному кажется??? прочитай первые 2 ТВОИХ слова. если это более корректные слова, то я президент РФ :)

http://forum.codenet.ru/showpost.php?p=261230&postcount=4

по сему и не дерзи ) тебе ж никто не давал права оскорблять форумчан =) если я не прав, то расскажи мне почему =)

244
08 октября 2008 года
UAS
2.0K / / 19.07.2006
Тень Пса, эээ да я и не сказал бы, что это оскорбление)) Но материццо на форуме лучше не надо)

Цитата:
на тему новых версий сразу вспоминается "windows vista" и "qip infium"

эт типа значит пхп5 фигня?? Ну дык, понимаете, вы сравниваете абсолютные разнцые вещи. В таком же духе можно сказать, что нафиг нам xHTML, когда все работает и на простом HTML)))

13
08 октября 2008 года
RussianSpy
3.0K / / 04.07.2006
На фиг нам xHTML если все работает в Windows infium?
312
08 октября 2008 года
dead_star
392 / / 26.11.2006
Цитата: UAS
эт типа значит пхп5 фигня??


я извиняюсь
это не был наезд на php5
я дома установил новый qip и меня слегка разозлило то что разработчики в него внедрили. извиняюсь погорячился

я против php, 5-ой версии, ничего не имею, скорей даже напротив,
очень хотел бы окончательно перейти на 5-ую версию,
но мне не хочется совсем отказываться от поддержки моих приложений старыми версиями

поясню:
когда читаю описание какого-нибудь крупного интернет приложения и в нем говорится о том что оно поддерживает например PHP начиная с версии 4.3 и MySQL начиная с 4.0 и когда в это же время пытаешься написать что-то соразмеримое ему (не на таком уровне, но все же) кажется логичным реализовывать в своем приложении такую поддержку
так же заказчики иногда требуют что бы приложение поддерживалось разными версиями php в том числе 4-ой

13
08 октября 2008 года
RussianSpy
3.0K / / 04.07.2006
Согласен. Нужно еще чтобы обязательно была поддержка РНР3, Netscape 4.0 и монохромных мониторов с разрешением 320х240.
312
08 октября 2008 года
dead_star
392 / / 26.11.2006
и все таки мне хотелось бы вернутся к нашей теме, пока модераторы ее не закрыли
мне все таки не ясно почему первый вызов функции выдает результат настолько отличающийся от всех последующих
я написал, на мой взгляд, более простой пример, с наработками предложенными UAS, который должен более четко демонстрировать то, что разногласие происходит именно при первом вызове
 
Код:
for ($i=1; $i<=5; $i++){
 $s = microtime(true);
 $e = microtime(true)-$s;
 echo "iter: $i - $e\n";
}

 
Код:
iter: 1 - 4.0531158447266E-6
iter: 2 - 2.1457672119141E-6
iter: 3 - 1.9073486328125E-6
iter: 4 - 1.9073486328125E-6
iter: 5 - 1.9073486328125E-6

пример показывает то что разница есть и в других случаях, но именно первый вызов функции возвращает значение с недопустимой разницей
13
08 октября 2008 года
RussianSpy
3.0K / / 04.07.2006
Поскольку функция обращается к системной функции ОС дело скорее всего в выделении памяти или в особенностях работы с ядром ОС. Проблема точно не в вашем коде.

Вот что у меня получилось на FreeBSD 6.1
 
Код:
iter: 1 - 4.05311584473E-06
iter: 2 - 5.96046447754E-06
iter: 3 - 2.14576721191E-06
iter: 4 - 3.09944152832E-06
iter: 5 - 1.90734863281E-06
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог