52

ランダムなphp.netの投稿から:

$ whatever=nullを実行している場合; 次に、変数のデータを書き換えています。メモリの解放/縮小が速くなる可能性がありますが、CPUサイクルを本当に必要とするコードからより早く盗む可能性があり、その結果、全体的な実行時間が長くなります。

どうやらこれは議論の余地のない真実なので、誰かが説明するほど親切かもしれません。

つまり、unset魔法のようにアセンブリ命令を実行しませんが、実行$whatever = null;しますか?与えられた答えは、言うのと同じくらい役に立ちます

$ whatever = nullはバッファとL1キャッシュをリセットし、unsetはバッファをクリアしてL2キャッシュをリセットします。

テクノマンボジャンボは答えを構成しません。

4

6 に答える 6

73

両方の方法の重要な違いは、シンボルテーブルからunset($a)も削除されることです。$a例えば:

$a = str_repeat('hello world ', 100);
unset($a);
var_dump($a);

出力:

Notice: Undefined variable: a in xxx
NULL

しかし、いつ$a = null使用されるか:

$a = str_repeat('hello world ', 100);
$a = null;
var_dump($a);

出力:

NULL

ベンチマークでもコードを実行したところ、対応するコード$a = nullよりも約6%高速であることがわかりましたunset()。シンボルテーブルエントリの更新は、削除するよりも速いようです。

補遺

他の違い(この小さなスクリプトに見られるように)は、各呼び出し後に復元されるメモリの量にあるようです。

echo memory_get_usage(), PHP_EOL;
$a = str_repeat('hello world ', 100);
echo memory_get_usage(), PHP_EOL;
// EITHER unset($a); OR $a = null;
echo memory_get_usage(), PHP_EOL;

unset()64バイトを除くすべてのメモリを使用すると、メモリが返され$a = null;ますが、272バイトを除くすべてのメモリが解放されます。両方の方法の間に208バイトの違いがある理由を知るのに十分な知識はありませんが、それでも違いはあります。

于 2012-12-02T08:41:54.420 に答える
8

unsetを使用すると、メモリ使用量と処理時間が少なくなります。

http://php.net/manual/en/function.unset.php#105980

于 2012-12-02T07:58:36.843 に答える
6

簡単なテストをしました。

このような単純なクラスを考えてみましょう。

class Cat{
    public $eyes  = 2;
    public $claws = 4;
    public $name  = "Kitty";
    public $sound = ['Meow', 'Miaou'];
}

このコードコードを実行します

$start = microtime(true);

for($i = 10000000; $i > 0; --$i){
    $cat = new Cat;
    $cat = null;
}

$end = microtime(true);

printf("Run in %s and use %s memory",
        round($end - $start, 2), round(memory_get_usage() / 1000, 2));

1.95で実行し、233.29メモリを使用します

この

for($i = 10000000; $i > 0; --$i){
    $cat = new Cat;
    unset($cat);
}

2.28で実行し、233.1メモリを使用します

価値があるのは、nullメソッドの実行速度が速いようです。

于 2017-06-01T13:03:38.993 に答える
6

上記の答えは素晴らしいです。特に、「両方のメソッドの重要な違いは、unset($ a)がシンボルテーブルから$aも削除することです」というコメントです。

しかし、この2つがどのように使用されているかを説明していないため、実際的な意味で質問に完全に答えた人はいないと思います。OK私たちは両方とも基本的に同じことをしていることを知っていると思います。なぜ一方を他方の上に使用するのですか?

ヌル

PHPがメモリ/ガベージコレクションを自己管理しているにもかかわらず、メモリをすぐに再利用します(費用はかかります)。

unset()

「到達できるときに」メモリを再利用するため、通常は推奨されます。したがって、リソースをすぐに割り当てないため、より高速であると見なされます。

nullとunsetをいつ使用する必要がありますか?

基本(スモールデータ)データ配列などは、メモリが問題にならないため、未設定の候補として適しています。データセットが大きい場合や、メモリをすぐに再利用する必要がある場合は、nullの方が適しています。たとえば、このような大規模なデータベースリクエストは、関数などで複数回呼び出された場合にPHPメモリの上限を非常に迅速に食いつぶす可能性があり、メモリがいっぱいになるなどして500ページのエラーが発生します。 )そしてメモリの蓄積の心配がほとんどないとき。

例:大きな配列を取得してMemCacheに配置します。

            list($inv1, $inv2, $inv3, $inv4) = array_chunk($inventory_array), 
            ceil(count($val['inventory']) / 4));
            MemCache::set($cacheKeyInv1, $inv1, $expiry);
            MemCache::set($cacheKeyInv2, $inv2, $expiry);
            MemCache::set($cacheKeyInv3, $inv3, $expiry);
            MemCache::set($cacheKeyInv4, $inv4, $expiry);
            for ($i = 1; $i < 5; $i++) {
                ${"inv" . $i} = null; // why not use unset ?
            }

forループはデータをクリーンアップするため、nullまたはunsetを使用できますが、データセットが大きいため、メモリをより迅速に再利用できるため、nullが推奨されます。

于 2018-06-19T14:38:27.340 に答える
1

コードを使用する

$a = str_repeat('hello world ', 10000);

$start1 = microtime(true);
unset($a);
$stop1 = microtime(true);

$a = str_repeat('hello world ', 10000);

$start2 = microtime(true);
$a = null;
$stop2 = microtime(true);

echo 'unset time lap of '. ( $stop1 - $start1 ) .'<br>';
echo 'null time lap of '. ( $stop2 - $start2 ) .'<br>';

10回:

unset time lap of 5.0067901611328E-6
null time lap of 1.1920928955078E-6

unset time lap of 9.5367431640625E-7
null time lap of 9.5367431640625E-7

unset time lap of 0
null time lap of 9.5367431640625E-7

unset time lap of 2.1457672119141E-6
null time lap of 1.1920928955078E-6

unset time lap of 2.1457672119141E-6
null time lap of 0

unset time lap of 9.5367431640625E-7
null time lap of 0

unset time lap of 1.9073486328125E-6
null time lap of 9.5367431640625E-7

unset time lap of 9.5367431640625E-7
null time lap of 0

unset time lap of 1.9073486328125E-6
null time lap of 9.5367431640625E-7

unset time lap of 0
null time lap of 0

null割り当ての方が、処理時間が短いようです。

于 2016-02-11T00:58:31.103 に答える
0

違いは、nullの割り当てはnullの割り当てであり、初期化解除ではないことです。パフォーマンスクリティカルな問題に取り組んでいない場合は、PHPバージョンで両方の可能性をテストする場合は、unsetを使用してシャットダウンします。主な違いはPHP7.4とプロパティタイプにあり、null許容ではないプロパティの設定を解除できますが、nullを割り当てることはできません。

class C {
    public int $value;
}

$c = new C();
var_dump(isset($c->value));   // false
$c->value = 5;
var_dump($c->value);          //5
unset($c->value);
//var_dump($c->value);       //Error: Typed property C::$value must not be accessed before initialization
var_dump(isset($c->value));  // false
$c->value = 5;
$c->value = null;            //Error Typed property C::$value must be int, null used

https://3v4l.org/VUVD1

于 2022-02-08T21:27:10.153 に答える