3 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個贊
哪個更快:isset()vsin_array()
isset() 是比較快的。
顯而易見,isset()僅測試單個值。而in_array()將遍歷整個數(shù)組,測試每個元素的值。
粗略的基準(zhǔn)測試很容易使用microtime()。
結(jié)果:
Total time isset(): 0.002857
Total time in_array(): 0.017103
注意:無論是否存在,結(jié)果都是相似的。
碼:
<?php
$a = array();
$start = microtime( true );
for ($i = 0; $i < 10000; ++$i) {
isset($a['key']);
}
$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;
$start = microtime( true );
for ($i = 0; $i < 10000; ++$i) {
in_array('key', $a);
}
$total_time = microtime( true ) - $start;
echo "Total time: ", number_format($total_time, 6), PHP_EOL;
exit;

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超2個贊
使用isset()可以提高查找速度,因?yàn)樗褂霉1?,從而避免了O(n)搜索。
首先使用djb哈希函數(shù)對密鑰進(jìn)行哈希處理,以確定中類似哈希密鑰的存儲桶O(1)。然后重復(fù)搜索該存儲桶,直到在中找到確切的密鑰O(n)。
除非有任何有意的哈希沖突,這種方法產(chǎn)生的性能要比更好in_array()。
請注意,isset()按照顯示的方式使用時,將最終值傳遞給另一個函數(shù)需要使用array_keys()創(chuàng)建一個新數(shù)組。通過將數(shù)據(jù)存儲在鍵和值中,可能會造成內(nèi)存折衷。
更新資料
查看代碼設(shè)計(jì)決策如何影響運(yùn)行時性能的好方法,可以查看腳本的編譯版本:
echo isset($arr[123])
compiled vars: !0 = $arr
line # * op fetch ext return operands
-----------------------------------------------------------------------------
1 0 > ZEND_ISSET_ISEMPTY_DIM_OBJ 2000000 ~0 !0, 123
1 ECHO ~0
2 > RETURN null
echo in_array(123, $arr)
compiled vars: !0 = $arr
line # * op fetch ext return operands
-----------------------------------------------------------------------------
1 0 > SEND_VAL 123
1 SEND_VAR !0
2 DO_FCALL 2 $0 'in_array'
3 ECHO $0
4 > RETURN null
不僅in_array()使用效率相對較低的O(n)搜索,還需要將其稱為函數(shù)(DO_FCALL),而為此isset()使用單個操作碼(ZEND_ISSET_ISEMPTY_DIM_OBJ)。
- 3 回答
- 0 關(guān)注
- 848 瀏覽
添加回答
舉報(bào)