来自C/C++背景,我习惯于自己做垃圾收集 - 即在使用它们之后释放资源(即C++版本中的RAII).
在使用它们之后,我发现自己未设置(主要是ORM)变量.这种习惯有什么好处吗?
我记得曾经读过一段时间,那些未设置的变量标志着它们被删除以引起PHP的注意 - 这可以帮助服务器端的资源使用 - 是真还是假?
[编辑]
我忘了提到,我使用的是PHP 5.3,而且我所做的大多数unset()调用都在一个循环中,我正在处理几个'重'的ORM变量
我发现,如果你不得不unset使用很多你可能做错了.让范围为您做"不安定".考虑两个例子:
1:
$var1 = f( ... );
....
unset( $var1 );
$var2 = g( ... );
....
unset( $var2 );
Run Code Online (Sandbox Code Playgroud)
2:
function scope1()
{
$var1 = f( ... );
....
} //end of function triggers release of $var1
function scope2()
{
$var2 = g( ... );
....
} //end of function triggers release of $var2
scope1();
scope2();
Run Code Online (Sandbox Code Playgroud)
第二个例子我更可取,因为它清楚地定义了范围并降低了将变量泄漏到全局范围的风险(仅在脚本结束时发布).
编辑:
要记住的另一件事是unsetPHP中的成本比普通范围的垃圾收集更多(CPU).虽然差异很小,但它表明了PHP团队的重点是什么unset.如果有任何东西unset应该给PHP了解如何释放内存,但它实际上增加了执行时间.unset只是与释放那些不再需要的变量,除非你做一些相当复杂的黑客攻击,重用变量(就像一个天然unset的老变量)和范围应该是大家永远需要的.
function noop( $value ){}
function test1()
{
$value = "something";
noop( $value ); //make sure $value isn't optimized out
}
function test2()
{
$value = "something";
noop( $value ); //make sure $value isn't optimized out
unset( $value );
}
$start1 = microtime(true);
for( $i = 0; $i < 1000000; $i++ ) test1();
$end1 = microtime(true);
$start2 = microtime(true);
for( $i = 0; $i < 1000000; $i++ ) test2();
$end2 = microtime(true);
echo "test1 ".($end1 - $start1)."\n"; //test1 0.404934883118
echo "test2 ".($end2 - $start2)."\n"; //test2 0.434437990189
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1972 次 |
| 最近记录: |