這些常見的 PHP 代碼性能對(duì)比你必須知道
通常我會(huì)使用常規(guī)的、顯而易見的 PHP 函數(shù)來編寫代碼來解決相應(yīng)的問題。但對(duì)于其中一些問題,我遇到了特別提高性能的替代解決方案。
在本文中,我想介紹其中的一些替代方案。如果你正在尋找在生產(chǎn)中進(jìn)一步減少執(zhí)行時(shí)間的可能性,這將非常有用。讓我們來看看哪些 PHP 方法可能會(huì)被性能更好的方法取代,以及是否有任何成本或權(quán)衡。
所有這些方法都在本地 Web 服務(wù)器上使用 PHP 7.4 進(jìn)行了測(cè)試
歡迎加入 我的后端技術(shù)交流群
1. 刪除重復(fù)項(xiàng)
你有一個(gè)包含重復(fù)項(xiàng)的大型數(shù)組,并且希望刪除它們,以便只有一個(gè)具有唯一值的數(shù)組。
常規(guī)
array_unique($array);
其他方式
array_keys(array_flip($array));
性能
我創(chuàng)建了一個(gè) 400 萬的數(shù)組,其中有 300 萬個(gè)重復(fù)項(xiàng),這是最好的優(yōu)化結(jié)果:

其他方式比常規(guī)方式 快了 1.8倍 (44.87%) . 平均也有大約 1.5 倍 (30%) 的提升。總結(jié):這僅適用于一維數(shù)組,因?yàn)閍rray_flip會(huì)反轉(zhuǎn)鍵和值.
2. 獲取隨機(jī)的數(shù)組元素
你想從一個(gè)大數(shù)組中獲取一個(gè)隨機(jī)值
常規(guī)
array_rand($array);
其他方式
$array[mt_rand(0,?count($array)?-?1)];
性能
我創(chuàng)建了一個(gè)包含 500 萬個(gè)元素的數(shù)組,這是最佳結(jié)果:

替代方法在此測(cè)量中快27.3 倍(96.33%)。平均快 8 倍 (87%)。這個(gè)結(jié)果特別令人驚訝,因?yàn)閙t_rand是 MersenneTwister 隨機(jī)數(shù)生成器的實(shí)現(xiàn),而且從 PHP7.1 開始,內(nèi)部隨機(jī)化算法已更改為使用完全相同的算法。
3. 字母數(shù)字字符測(cè)試
如果你有一個(gè)字符串,并且希望測(cè)試它是否只包含字母數(shù)字字符。
常規(guī)
preg_match('/[a-zA-Z0-9]+/',?$string);
其他方式
ctype_alnum($string);
性能
我創(chuàng)建了一個(gè)包含超過 100k 字母數(shù)字和非字母數(shù)字字符串的數(shù)組。以下是排名靠前的結(jié)果:

替代方法在此測(cè)量中快 7.5 倍 (86.59%)。平均而言,它快了約 4 倍 (76%)。
同樣的道理也可以應(yīng)用于 ctype_alpha() 命令 (檢查字母字符) 和 ctype_digit() 命令 (檢查數(shù)字字符)。
4. 替換子字符串
你有一個(gè)字符串,并且希望用另一個(gè)子字符串替換它的一部分。
常規(guī)
str_replace('a',?'b',?$string);
其他方式
strtr($string,?'a',?'b');
性能
我創(chuàng)建了一個(gè)包含 500 萬個(gè)隨機(jī)字符串的數(shù)組。以下是排名靠前的結(jié)果:

替代方法在此測(cè)量中快2.2 倍(54.83%)。平均快 2 倍 (51%)。
額外的性能改進(jìn)
以下是我在編碼約定中搜集的一些附加方法,我發(fā)現(xiàn)它們可以略微提高性能 (如果適用):
更喜歡 JSON 而不是 XML
在之前聲明變量,而不是在循環(huán)的每次迭代中聲明變量
避免循環(huán)頭部中的函數(shù)調(diào)用 (在每次迭代中調(diào)用的 for ($i=0; $i
注銷消耗內(nèi)存變量
首選 select 語句而不是多個(gè) if 語句
優(yōu)先選擇 require/include 而不是 require_once/include_once (確保正確的操作碼緩存)
最后一句話:我知道關(guān)于過早優(yōu)化的討論。我同意,生產(chǎn)中的性能取決于諸如數(shù)據(jù)庫查詢之類的瓶頸,在處理性能時(shí)應(yīng)該重點(diǎn)關(guān)注這些瓶頸。但我認(rèn)為,如果有更快的替代方案,例如,在 regex 更容易處理和維護(hù)的情況下,為什么不使用它們呢?
總結(jié)
我們已經(jīng)看到,即使使用當(dāng)前的 PHP 7.4 (已經(jīng)比以前的 PHP 版本快得多),也有可能使用其他方法進(jìn)一步提高腳本性能。
求一鍵三連:點(diǎn)贊、轉(zhuǎn)發(fā)、在看
