Что из перечисленного лучше для использования памяти? - PullRequest
0 голосов
/ 01 октября 2019

Что из перечисленного лучше всего подходит для использования памяти?

    $a = new foo();
    $username = $a->getuserName('username');
    $b = new bar();
    $b->validateUserName($username);

    //OR

    ( new bar() )->validateUserName( (new foo() )->getuserName($username) );

Увеличивает ли использование объекта переменной памяти использование памяти?

По-разному ли PHP обрабатывает другие языки?

Кто-то может объяснить управление памятью PHP (должен и не должен)

1 Ответ

0 голосов
/ 01 октября 2019

Для проверки использования памяти вы можете использовать следующий шаблон:

<?php
   $mem = 0; // create variable before "memory_get_usage()";
   $mem = memory_get_usage();

   // Place your code here

   $mem = memory_get_usage() - $mem;
   print ("Memory used: $mem");

Например, я создал заглушку:

<?php
    class foo {
        function getuserName($a) {
            return $a;
        }
    }

    class bar {
        function validateUserName($a) {
        }
    }

    $mem = 0; // Allocate variable before "memory_get_usage()";
    $mem = memory_get_usage();

    $a = new foo();
    $username = $a->getuserName('username');
    $b = new bar();
    $b->validateUserName($username);

    $mem = memory_get_usage() - $mem;
    print ("Memory used: $mem\r\n");

результат на php 5.6.40 win x64 равно 560 байт.

Если я изменю код на ваш второй вариант

    ...

    $mem = 0; // Allocate variable before "memory_get_usage()";
    $mem = memory_get_usage();

    // Note I've changed $username to 'username' 
    (new bar())->validateUserName( (new foo())->getuserName('username') );

    $mem = memory_get_usage() - $mem;
    print ("Memory used: $mem\r\n");

Теперь результат равен 0 байт.

Давайте рассмотрим другой вариант:

...
   function test() {
       $a = new foo();
       $username = $a->getuserName('username');
       $b = new bar();
       $b->validateUserName($username);
   }

   $mem = 0; // Allocate variable before "memory_get_usage()";
   $mem = memory_get_usage();

   test();

   $mem = memory_get_usage() - $mem;
   print ("Memory used: $mem\r\n");

Используемая память: 64

Давайте изменим функцию на второй вариант:

...
   function test() {
      (new bar())->validateUserName( (new foo())->getuserName('username') );
   }
...

Теперь результат снова равен 64 байтов.

И еще один тест:

...
    $mem = 0; // Allocate variable before "memory_get_usage()";
    $mem = memory_get_usage();

    $a = new foo();
    $username = $a->getuserName('username');
    $b = new bar();
    $b->validateUserName($username);
    unset($a);
    unset($b); 
    unset($username);

    $mem = memory_get_usage() - $mem;
    print ("Memory used: $mem\r\n");

Здесь результат снова 0 .

Отсюда я могу предположить, что когда вы создаете глобальные переменные, они остаются все время, и объект, на который они ссылаются, не может быть собран сборщиком мусора, поэтому они остаются в памяти. Как только вы сбрасываете переменные, или объявляете их в определенной области (функции), или вообще не объявляете их - в результате нет никакой разницы. Чтобы увидеть, когда объект уничтожен, а память освобождена, вы можете добавить в классы дескрипторы:

...
     function __destruct() {
       print "foo/bar destroyed\r\n";
     }
...

Тем не менее, запись вызовов в одну строку вообще не выделяет ненужные переменные, что увеличивает время выполнения.

Но моя рекомендация: не беспокойтесь о такой оптимизации на языке, таком как php. Сам язык не такой быстрый и не такой эффективный. Например, добавление каждого элемента в массив может стоить более 100 байт памяти. Не стоит тратить несколько байтов, делая код менее читаемым.

...