以下哪项最适合内存使用?
<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内存的管理(应该和不应该)
答案 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多个字节的内存。通过降低代码的可读性来节省几个字节是不值得的。