Показать полную графическую версию : [решено] Откуда берутся микросекунды?
Например, в PHP есть функция microtime(), выдающая текущее значение микросекунд. Секунды - ещё ладно, можно там посчитать (хотя тоже не в курсе, но часы-то делают электронные). А вот микросекунды откуда берутся? Неужели таймер замеряет всю эту ерунду, затрачивая бесценные ресурсы процессорного (или ещё какого) времени?
Или это рандомом выдаётся?
Coutty,
думаешь на такое дело нужно много процессорного времени?
CyberDaemon
19-09-2007, 16:27
Какая разница микросхеме-часам реального времени, считать секунды или микросекунды? Тактовая-то на ней намного выше. Вот и считает с точностью до микросекунды. Процессору фиолетово, чем там занимается микросхема - он порт опросил - данные получил.
Negativ, думал, что много) Если так прикинуть, то целый мегагерц (если принимать инкрементный способ счёта) уходил бы. Это сейчас немного, а раньше-то... ого-го_О
CyberDaemon, и где такая штука находится? В чипсете, в процессоре или ещё где?
dmitryst
19-09-2007, 16:36
Процессору фиолетово, чем там занимается микросхема - он порт опросил - данные получил. » - хорошо сказал, однако! распечатаю.... :)
Coutty, дело в том, что часы считают как раз микросекунды, есть еще и таймеры, которые можно программировать на превышение определенного порога (т.е. можно считать через 5 мкс, 25, 100 и так далее, как душе угодно)
CyberDaemon
19-09-2007, 16:47
и где такая штука находится? В чипсете, в процессоре или ещё где? »
В современных компах - в южном мосту. В древних - отдельная микруха на мамке. И она тоже с точностью до милисекунды считала, несмотря на то, что тактовая у проца была всего 8Мгц :)
dmitryst, дык это уже программно считают, наверное. Неужто микрочип будет пропускать такты?
CyberDaemon, а в древних оно зачем?) Ну лампы там... И что? Неужто людям так было важно? Могли ведь и по часам замерить что надо. Или не настолько древних?=)
Кстати, слышал теорию, что из-за этих-то древних байт и равен восьми битам. Сейчас бы за 32 или 64 бита взяли, наверное, исключив проблемы с нехваткой IP-адресов, кодировками и прочей фигнёй.
CyberDaemon
20-09-2007, 08:32
Или не настолько древних?:) Я про 8086
Кстати, слышал теорию, что из-за этих-то древних байт и равен восьми битам. Сейчас бы за 32 или 64 бита взяли, наверное, исключив проблемы с нехваткой IP-адресов, кодировками и прочей фигнёй. »
Это Вы ошибаетесь.
Байт он всегда байт - 8 бит.
А есть еше машинное (процессорное) слово, определяемое логической разрядностью шины данных процессора (а не адресной шиной).
Так что для процессоров
8080 - слово равнялось байту
8086 - 2м байтам
80386 - 4м байтам
И только сейчас машинное слово у Intel выросло до 8 байт.
Кстати, у первого процессора 4004, если мне память не изменяет, машинное слово равнялось полубайту.
исключив проблемы с нехваткой IP-адресов »
Ох уж эти журналисты, и "лейблы" которые они клеют.
Нет такой проблемы.
Есть, точнее была до внедрения VLSM, проблема нехватки IP-сетей (диапазонов), но сотояла она не в недостаточной общей разрядности, а в заложенной в првоначальный стандарт жесткой "классовости" сети.
CyberDaemon
20-09-2007, 10:34
8080 - слово равнялось байтуА еще 8088 был - урезанный 8086, 16-разрядный унутре, но 8-разрядный снаружи по шине.
А еще 8088 был - урезанный 8086, 16-разрядный унутре, но 8-разрядный снаружи по шине. »
Это не считается, это было физическое мультиплексирование. Логическая разрядность при этом не менялась.
У последовательных шин и интерфейсов вообще два проводка, дык их никто двухбитными не считает же :)
Байт он всегда байт - 8 бит. »
Нет, я немного не о том. Что есть байт? Физической сущности у него нет. Это всего лишь условность. Типа как в ящике - 6 бутылок водки газировки. Просто так принято.
Если бы процессоры сразу были 32-разрядные, зачем стоило бы оговаривать байт, как 8 бит?Кстати, у первого процессора 4004, если мне память не изменяет, машинное слово равнялось полубайту. »
Ну это ж вообще калькулятор))
Немного увлекаюсь программированием, так вот в WinAPI есть такая функция - GetTickCount
Считывает вpемя, пpошедшее с момента запуска системы.
Возвpащаемое значение - Пpошедшее вpемя (в миллисекундах).
Достаточно сравнить параметр GetTickCount в начале и в конце нужного периода, чтобы получить интервал времени в микросекундах. А в PHP функция microtime() скорее всего использует вышеуказанную функцию WinAPI.
В WinAPI как известно есть только те функции и процедуры которые используются самой Windows. Рискну предположить, что эти "микросекунды" необходимы для распределения процессорного времени между приложениями. Ведь пока еще не придумали процессор позволяющий одновременно обрабатывать несколько десятков задач и эти функции берет на себя ОС.
А в PHP функция microtime() скорее всего использует вышеуказанную функцию WinAPI.
не факт :) php изначально проектировался под unix системы, а там API другой.
/*
+----------------------------------------------------------------------+
| PHP Version 5 |
+----------------------------------------------------------------------+
| Copyright (c) 1997-2006 The PHP Group |
+----------------------------------------------------------------------+
| This source file is subject to version 3.01 of the PHP license, |
| that is bundled with this package in the file LICENSE, and is |
| available through the world-wide-web at the following url: |
| http://www.php.net/license/3_01.txt |
| If you did not receive a copy of the PHP license and are unable to |
| obtain it through the world-wide-web, please send a note to |
| license@php.net so we can mail you a copy immediately. |
+----------------------------------------------------------------------+
| Author: Paul Panotzki - Bunyip Information Systems |
+----------------------------------------------------------------------+
*/
/* $Id: microtime.c,v 1.53.2.2 2006/01/01 12:50:15 sniper Exp $ */
#include "php.h"
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef PHP_WIN32
#include "win32/time.h"
#elif defined(NETWARE)
#include <sys/timeval.h>
#include <sys/time.h>
#else
#include <sys/time.h>
#endif
#ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h>
#endif
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include "microtime.h"
#include "ext/date/php_date.h"
#define NUL '\0'
#define MICRO_IN_SEC 1000000.00
#define SEC_IN_MIN 60
#ifdef HAVE_GETTIMEOFDAY
static void _php_gettimeofday(INTERNAL_FUNCTION_PARAMETERS, int mode)
{
zend_bool get_as_float = 0;
struct timeval tp = {0};
struct timezone tz = {0};
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &get_as_float) == FAILURE) {
return;
}
if (gettimeofday(&tp, &tz)) {
RETURN_FALSE;
}
if (get_as_float) {
RETURN_DOUBLE((double)(tp.tv_sec + tp.tv_usec / MICRO_IN_SEC));
}
if (mode) {
timelib_time_offset *offset;
offset = timelib_get_time_zone_info(tp.tv_sec, get_timezone_info(TSRMLS_C));
array_init(return_value);
add_assoc_long(return_value, "sec", tp.tv_sec);
add_assoc_long(return_value, "usec", tp.tv_usec);
add_assoc_long(return_value, "minuteswest", -offset->offset / SEC_IN_MIN);
add_assoc_long(return_value, "dsttime", offset->is_dst);
timelib_time_offset_dtor(offset);
} else {
char ret[100];
snprintf(ret, 100, "%.8f %ld", tp.tv_usec / MICRO_IN_SEC, tp.tv_sec);
RETURN_STRING(ret, 1);
}
}
/* {{{ proto mixed microtime([bool get_as_float])
Returns either a string or a float containing the current time in seconds and microseconds */
PHP_FUNCTION(microtime)
{
_php_gettimeofday(INTERNAL_FUNCTION_PARAM_PASSTHRU, 0);
}
/* }}} */
/* {{{ proto array gettimeofday([bool get_as_float])
Returns the current time as array */
PHP_FUNCTION(gettimeofday)
{
_php_gettimeofday(INTERNAL_FUNCTION_PARAM_PASSTHRU, 1);
}
#endif
/* }}} */
#ifdef HAVE_GETRUSAGE
/* {{{ proto array getrusage([int who])
Returns an array of usage statistics */
PHP_FUNCTION(getrusage)
{
struct rusage usg;
long pwho = 0;
int who = RUSAGE_SELF;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &pwho) != FAILURE && pwho == 1) {
who = RUSAGE_CHILDREN;
}
memset(&usg, 0, sizeof(struct rusage));
if (getrusage(who, &usg) == -1) {
RETURN_FALSE;
}
array_init(return_value);
#define PHP_RUSAGE_PARA(a) \
add_assoc_long(return_value, #a, usg.a)
#if !defined( _OSD_POSIX) && !defined(__BEOS__) /* BS2000 has only a few fields in the rusage struct */
PHP_RUSAGE_PARA(ru_oublock);
PHP_RUSAGE_PARA(ru_inblock);
PHP_RUSAGE_PARA(ru_msgsnd);
PHP_RUSAGE_PARA(ru_msgrcv);
PHP_RUSAGE_PARA(ru_maxrss);
PHP_RUSAGE_PARA(ru_ixrss);
PHP_RUSAGE_PARA(ru_idrss);
PHP_RUSAGE_PARA(ru_minflt);
PHP_RUSAGE_PARA(ru_majflt);
PHP_RUSAGE_PARA(ru_nsignals);
PHP_RUSAGE_PARA(ru_nvcsw);
PHP_RUSAGE_PARA(ru_nivcsw);
PHP_RUSAGE_PARA(ru_nswap);
#endif /*_OSD_POSIX*/
PHP_RUSAGE_PARA(ru_utime.tv_usec);
PHP_RUSAGE_PARA(ru_utime.tv_sec);
PHP_RUSAGE_PARA(ru_stime.tv_usec);
PHP_RUSAGE_PARA(ru_stime.tv_sec);
#undef PHP_RUSAGE_PARA
}
#endif /* HAVE_GETRUSAGE */
/* }}} */
/*
* Local variables:
* tab-width: 4
* c-basic-offset: 4
* End:
* vim600: sw=4 ts=4 fdm=marker
* vim<600: sw=4 ts=4
*/
GetTickTime не используется.
Что есть байт? Физической сущности у него нет. »
Почему это? В ту эпоху больших машин, основной системой счисления была восьмеричная.
Байт был синонимом октета, и одновременно равнялся ходовому машинному слову.
Это у 32х и более разрядов нет "физической основы", т. к. я не припомню ходовых систем счисления "длиннее" шестнадцатиричной.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.