PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (594): В начало « ... 11 12 13 14 [15] 16 17 18 19 ... » В конец

> Найдено сообщений: 8901
EuGen Отправлено: 17 Ноября, 2013 - 15:11:01 • Тема: Ох уж эти конструкторы • Форум: Объектно-ориентированное программирование

Ответов: 7
Просмотров: 2117
VestCoastman
PHP:
скопировать код в буфер обмена
  1.     class b extends a
  2.     {
  3.        public function __construct()
  4.        {
  5.           parent::__construct();
  6.           //other code
  7.        }
  8.        public function welcome()
  9.        {
  10.           return $this->var1.$this->var2;
  11.        }
  12.     }
EuGen Отправлено: 17 Ноября, 2013 - 15:05:38 • Тема: Ох уж эти конструкторы • Форум: Объектно-ориентированное программирование

Ответов: 7
Просмотров: 2117
VestCoastman пишет:
Стоп, так в данном случае, я обращусь к данным переменным, но не получу их значения, указанные в конструкторе, то бишь HelloWorld

Получите - так как, поскольку в классе b не определён собственный конструктор, будет унаследован конструктор класса a и выполнена инициализация.
EuGen Отправлено: 15 Ноября, 2013 - 19:51:12 • Тема: Преобразование двумерного массива в json • Форум: Если скрипт не работает

Ответов: 10
Просмотров: 7343
С Новым Годом
EuGen Отправлено: 15 Ноября, 2013 - 18:39:28 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Hapson пишет:
А вот Memory... что-то я сомневаюсь, что она врет. Здесь подсчитывается, сколько памяти было выделено во время выполнения скрипта. И в эту обертку попадают как все телодвижения, так и все определения функций, классов и прочее.

Нет, это не так - и Вы видели это на примере, который сами же и привели. Такой способ не учтёт ничего, что определено внутри окружения функций/методов
EuGen Отправлено: 15 Ноября, 2013 - 18:28:54 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Hapson пишет:
Я имел ввиду свой код. У меня в самом начале index.php определены стартовые переменные времени и памяти

Время определять так не стоит - потому что даже для всего скрипта оно будет незначащим, ведь однократное применение не даёт верного значения (тем более если речь идёт о веб-сайте, где приложение работает со многими сторонними ресурсами, порождая случайные сетевые задержки, например).
Память (Memory) - не имеет смысла, поскольку не отразит того, что делается уровнем ниже глобального.
Только "максимальная память" (Max Memory) имеет некий смысл, так как отразит максимально потреблённую память. Однако для полной картины это нужно собирать в статистических таблицах, поскольку если веб-сайт, например, работает с БД, то результат может быть разным в зависимости от её выборки и т.п.
EuGen Отправлено: 15 Ноября, 2013 - 18:20:49 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Hapson пишет:
То есть если я этим кодом обернул сайт, то в итоге получаю погодные виджеты?

Не понял, о чём Вы
Hapson пишет:
А как тогда быть с памятью, если нужно измерить потребление целого скрипта

Для измерения памяти, которая была потреблена всем скриптом, целиком - вполне подойдёт memory_get_peak_usage(). Для измерения того, сколько памяти потребила конкретная функция - нет. Подумайте, зачем это нужно? А именно:

- Измерили память, потреблённую всем скриптом. Оказалось, что слишком много
- Что делать дальше? Измерять, сколько памяти потребляет конкретный участок кода (будь то функция или что-либо ещё). И вот здесь уже не помогут ни memory_get_usage() ни memory_get_peak_usage()
- Разумной альтернативой будет использовать профилировщик (и для задачи, которую Вы озвучили, это - наиболее правильное решение, поскольку только профилировщик предоставит точные данные)

Это то, что касается того, где может пригодиться возможность измерения памяти, потреблённой конкретным участком кода. Класс в данной теме предназначен для сравнительного анализа, его нельзя использовать для точных измерений, поскольку есть определённые ресурсы, которые он потребит для служебных целей. Однако, тем не менее, используя его, можно вполне достоверно узнать, что "функция X потребила на Z% больше/меньше памяти, чем функция Y" - а так же оценить порядок потребления памяти (но не абсолютно точное значение)
EuGen Отправлено: 15 Ноября, 2013 - 18:06:18 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Hapson пишет:
http://clip2net[dot]com/s/6blBgF

Даже на Вашем примере видно, что память (поле Memory) измеряется некорректно. Она не может составлять менее 4*10.000 байт, Ваш же результат - 0.18Kb (=180 байт). И это понятно, почему - см. второй пункт в моём предыдущем сообщении.
Насчёт максимальной памяти - см. третий пункт, почему нельзя использовать memory_get_peak_usage() для определения этого (а так же код в моём примере)
EuGen Отправлено: 15 Ноября, 2013 - 17:50:06 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Hapson пишет:
Однако могу
http://clip2net[dot]com/s/6bkYxB

Однако, нет:
http://codepad[dot]viper-7[dot]com/QSlOyT

Все три значения ошибочны, потому что:

- Время нельзя измерить одной итерацией. Как уже сказано выше, для этого требуется как минимум 1E6 повторений
- "Память" (Memory) измерена неверно, так как в глобальном контексте переменная внутри функции foo() не будет учтена, однако там строка длиной 4*1E4 байт
- "Максимальная память" (Max Memory) измерена неверно, так как до старта теста есть контекст, который использует больше памяти, чем тестируемая функция.
EuGen Отправлено: 15 Ноября, 2013 - 17:38:22 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Hapson пишет:
Не пойму, зачем для этого писать столько кода...

В Вашем случае и тот код, что Вы привели - не нужен, поскольку верным инструментом будет профилировщик. Кроме того, Вы никогда не сможете таким способом измерить память.
EuGen Отправлено: 15 Ноября, 2013 - 17:28:41 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Ch_chov пишет:
А зачем тики? Почему не memory_get_peak_usage?


Потому что:
PHP:
скопировать код в буфер обмена
  1.  
  2. function foo($count)
  3. {
  4.    $result = str_repeat('test', $count);
  5. }
  6.  
  7. foo(1E5);
  8. var_dump(memory_get_peak_usage()); //something like 624824
  9. foo(1E3);
  10. var_dump(memory_get_peak_usage()); //still 624824 cause peak was for 1E5

- то есть пропадает возможность динамического использования, а если это так, то с таким же успехом можно использовать профилировщик.
EuGen Отправлено: 15 Ноября, 2013 - 16:41:16 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Ch_chov пишет:
Каким образом?

Передачей измеряющего callback, в котором выполняется что-нибудь наподобие system() + df
EuGen Отправлено: 15 Ноября, 2013 - 15:54:04 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Вообще, измерение памяти для моих задач было весьма критичным моментом. При этом дело сводилось зачастую к таким вещам, как проверка копирования/передачи по ссылке. При этом использовать внешний профилировщик было неудобно из-за большого объема мелких правок при оптимизации.

Кроме того, данный инструмент успешно использовался для измерений используемого файлового пространства для функций, оперирующих с ФС. Насчёт времени - это верно. Как правило, 1E6 - минимальный порог определения достоверности измерения.
EuGen Отправлено: 15 Ноября, 2013 - 11:47:17 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
esterio
Это разные измерения и потому они проводятся разными методами. Однако же ничто не мешает измерить время, затем память и после этого через array_merge() собрать всё в один массив (именно по этой причине флаги значений в классе сделаны различными)
EuGen Отправлено: 15 Ноября, 2013 - 10:13:10 • Тема: Измерение памяти и времени в PHP • Форум: Пользовательские функции

Ответов: 24
Просмотров: 2433
Приветствую,

Представляю вашему вниманию простой инструмент, который предоставляет возможность тестировать функции - чтобы измерить время их исполнения/потребляемую память. Так же существует возможность определять собственную функцию для измерения, однако она, разумеется, должна возвращать числовые значения.
CODE (php):
скопировать код в буфер обмена
  1. namespace Benchmark;
  2.  
  3. final class Measure
  4. {
  5.     const MEMORY_VALUE      = 0;
  6.     const BENCHMARK_VALUE   = 1;
  7.     const BENCHMARK_AVERAGE = 2;
  8.     const BENCHMARK_COUNT   = 3;
  9.    
  10.     private $max, $memory;
  11.  
  12.     public function memoryTick()
  13.     {
  14.        $this->memory = memory_get_usage() - $this->memory;
  15.        $this->max    = $this->memory>$this->max?$this->memory:$this->max;
  16.        $this->memory = memory_get_usage();
  17.     }
  18.     /**
  19.      *
  20.      * @param callable $function A function to be measured
  21.      * @param array $args Parameters to be passed for measured function
  22.      * @return array Result currently contains one value: used memory space
  23.      */
  24.     public function benchmarkMemory(callable $function, array $args=[])
  25.     {
  26.        declare(ticks=1);
  27.        $this->memory = memory_get_usage();
  28.        $this->max    = 0;
  29.  
  30.        register_tick_function('call_user_func', [$this, 'memoryTick']);
  31.        $this->measureFunction($function, $args, 1);
  32.        unregister_tick_function('call_user_func');
  33.        return [
  34.           self::MEMORY_VALUE => $this->max
  35.        ];
  36.     }
  37.     /**
  38.      *
  39.      * @param callable $function A function to be measured
  40.      * @param array $args Parameters to be passed for measured function
  41.      * @param int $count Count of measurements
  42.      * @return array Result currently contains: total time, average time and measurements count
  43.      * @throws \InvalidArgumentException If measurements count is invalid
  44.      */
  45.     public function benchmarkTime(callable $function, array $args=[], $count=1)
  46.     {
  47.         return $this->benchmarkCustom('microtime', $function, [1], $args, $count);
  48.     }
  49.     /**
  50.      *
  51.      * @param callable $benchmark Function which will do measurements
  52.      * @param callable $function A function to be measured
  53.      * @param array $benchmarkArgs Parameters to be passed for measurement function
  54.      * @param array $functionArgs Parameters to be passed for measured function
  55.      * @param int $count Count of measurements
  56.      * @return array Result currently contains: total value, average value and measurements count
  57.      * @throws \InvalidArgumentException If measurements count is invalid
  58.      * @throws \LogicException If measurement function did not returned numeric value
  59.      */
  60.     public function benchmarkCustom(callable $benchmark, callable $function, array $benchmarkArgs=[], array $functionArgs=[], $count=1)
  61.     {
  62.         if(!is_int($count) || $count <=0)
  63.         {
  64.             throw new \InvalidArgumentException('Count of measure times must be positive integer');
  65.         }
  66.         $init   = call_user_func_array($benchmark, $benchmarkArgs);
  67.         if(!is_numeric($init))
  68.         {
  69.             throw new \LogicException('Benchmark function must return valid numeric value');
  70.         }
  71.         $this->measureFunction($function, $functionArgs, $count);
  72.         $end    = call_user_func_array($benchmark, $benchmarkArgs);
  73.         return [
  74.             self::BENCHMARK_VALUE    => $end - $init,
  75.             self::BENCHMARK_AVERAGE  => ($end - $init) / $count,
  76.             self::BENCHMARK_COUNT    => $count
  77.         ];
  78.     }
  79.    
  80.     private function measureFunction($function, $args, $count)
  81.     {
  82.         for($i=0; $i<$count; $i++)
  83.         {
  84.             $result = call_user_func_array($function, $args);
  85.         }
  86.     }
  87. }

- пример использования:
CODE (php):
скопировать код в буфер обмена
  1. spl_autoload_register(function($className)
  2. {
  3.     $path = explode('\\', $className);
  4.     include_once(end($path).'.php');
  5. });
  6.  
  7. $measure    = new \Benchmark\Measure;
  8.  
  9. $result     = $measure->benchmarkMemory('str_repeat', ['test', 1E4]);
  10. var_dump($result);
  11. $result     = $measure->benchmarkMemory('str_repeat', ['test', 1E3]);
  12. var_dump($result);
  13. $result     = $measure->benchmarkTime('uniqid', [1], 1000);
  14. var_dump($result);


Следует понимать, что инструмент предназначен для сравнительных измерений. Иначе говоря, есть две (или больше) функции и требуется понять, насколько первая лучше/хуже второй. Для этого данный инструмент и будет полезен. Он не предназначен для получения точных (абсолютных) значений используемой памяти/времени, так как использует много внутренних преобразований и вызовов, что служит причиной пусть и небольшой, но неточности.

Соответствующий репозиторий доступен на GitHub
EuGen Отправлено: 12 Ноября, 2013 - 08:17:24 • Тема: Проверка переменных в одном условии • Форум: Вопросы новичков

Ответов: 2
Просмотров: 143

?

Страниц (594): В начало « ... 11 12 13 14 [15] 16 17 18 19 ... » В конец
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB