以下哪项最适合内存使用?

时间:2019-10-01 08:54:31

标签: php memory-management

以下哪项最适合内存使用?

<p>
    test 1
  </p>
  <h2 class="test-2">
    test 2
  </h2>
  <h3 class="test-3">
    test 2
  </h3>

  <button onclick="addClass()">
    click me
  </button>

将对象存储在变量中会增加内存使用吗?

PHP对其他语言有不同的对待吗?

有人可以解释PHP内存的管理(应该和不应该)

1 个答案:

答案 0 :(得分:0)

要测试内存使用情况,可以使用下一个模板:

<?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多个字节的内存。通过降低代码的可读性来节省几个字节是不值得的。