怪我咯2017-05-16 13:00:57
isset は配列が空かどうかを判断できません
他の 2 つ: http://stackoverflow.com/ques...
結論としては、countよりもemptyの方が効率的です
仅有的幸福2017-05-16 13:00:57
結論だけ言いましょう: 空が最も効率的です。
count は、まず配列の長さをカウントしてから判断する必要があります。
これは間違っていると指摘する返信もありました
カウントの時間計算量は O(n) だとずっと思っていましたが、今回顔を叩かれた後、元のコードを読んで、実際には O(1) であることがわかりました。
ソースコードのリンクを数える
count 関数は配列で動作します:
リーリー php_count_recursive 操作を確認してから、配列に対する php_count_recursive 関数の操作を見てみましょう: cnt = zend_hash_num_elements(Z_ARRVAL_P(array));
zend_hash_num_elements コード:
リーリーisset は、変数が定義されているか、NULL 値があるかどうかのみを検出できます。
変数が最初に定義されている場合、!$array は空と同等です。効率も同等です。
天蓬老师2017-05-16 13:00:57
isset
不能判断我就不回答了,这是PHP基础知识,看手册去
下面主要讲empty
和count
違い
実装中、empty
,还是count
,都是取的zVal - value
指向的HashTable
结构中的elem_num
他の回答では、次のように言います
count
需要计算长度,拜托,PHP
会那么傻?还傻乎乎的跑一遍链表,count
会直接返回数组的elem_num
つまり、2つの判定方法、empty
就是执行了elem_num <= 0
に違いはありません。どちらも基本となるコードを実行するため、実行速度が同じであることを意味しません。
http://stackoverflow.com/ques... のテスト結果によると (テスト結果は以下にあります)、count
的确要比empty
慢一点,也许大家会疑惑,既然都是判断的elem_num
が見つかります。なぜ遅いのでしょうか?
PHPマニュアルによると:
空の説明行があります:
関数ではなく言語コンストラクターであるため、変数関数から呼び出すことはできません。
結果は明らかです: count
是函数,empty
却是一个语言构造器
既然是语言构造器
,那执行效率是肯定比函数高的,比如echo
也是语言构造器
、
例えばecho 'str1','str2';
的效率就比 echo 'str1'.'str2';
高,更不用说print
しかし、OpCache または JIT を使用した後は、両方とも最適化されているため、両者に違いはありません (以下を参照)。