php 編程題 加法計(jì)算器:PHP內(nèi)部字符串操作函數(shù)(1)(組圖)php大賽編程題答案
2023-02-08
1串
1.1 少用正則表達(dá)式
如果可以使用PHP內(nèi)部的字符串操作函數(shù),盡量使用它們來代替正則表達(dá)式,因?yàn)樗鼈兊男时日齽t表達(dá)式高。
不用說,正則化消耗的性能最多。
函數(shù)比函數(shù)快得多,函數(shù)比來得快。
您是否錯(cuò)過了一個(gè)有用的功能?
例如:(),(),(),(),(),()。
1.2 字符替換
如果您需要轉(zhuǎn)換的只是單個(gè)字符,請使用字符串 as() 函數(shù)進(jìn)行替換,而不是數(shù)組:
$addr = ($addr, "abcd", "efgh"); // 建議
$addr = ($addr, ('a' => 'e', )); // 不建議
效率提升:10倍。
字符替換比常規(guī)替換快,但比正則表達(dá)式快 1/4。
另外,不要做無意義的替換,即使沒有替換也為它們的參數(shù)分配內(nèi)存。 非常慢!
使用第一次查找(非常快)來查看是否需要更換,如果需要,則進(jìn)行更換。
如果需要更換,效率幾乎相等,相差約 0.1%。
如果不需要更換:使用速度提高 200%。
1.3 壓縮大字符串
使用()和()壓縮和解壓一個(gè)大容量的字符串,然后存入和存出數(shù)據(jù)庫。
這個(gè)內(nèi)置函數(shù)使用了 gzip 算法,可以將字符串壓縮 90%。
1.4 回聲輸出
使用逗號而不是點(diǎn)來回顯字符串更快。
雖然,echo 是一種語言結(jié)構(gòu),而不是真正的功能。
但是,它可以將多個(gè)以逗號分隔的字符串作為“函數(shù)”參數(shù)傳遞,因此速度會(huì)更快。
回顯 $str1, $str2; // 快速地
回顯 $str1 。 $str2;// 有點(diǎn)慢
1.5 盡量使用單引號
PHP 引擎允許使用單引號和雙引號來包裹字符串變量,但是它們的速度有很大的不同!
帶雙引號的字符串會(huì)告訴PHP引擎先讀取字符串的內(nèi)容,找到其中的變量,并更改變量對應(yīng)的值。
一般來說,字符串是沒有變量的,使用雙引號會(huì)導(dǎo)致性能不佳。
最好使用字符串連接而不是雙引號字符串。
$output = "This is a plain string"; // 不好的實(shí)踐
$output = 'This is a plain string'; // 好的實(shí)踐
$type = "mixed"; // 不好的實(shí)踐
$output = "This is a $type string";
$type = 'mixed'; // 好的實(shí)踐
$output = 'This is a ' . $type . ' string';
1.6 代替使用
在檢查字符串的長度時(shí),我們首先想到的是使用 () 函數(shù)。
這個(gè)函數(shù)執(zhí)行得相當(dāng)快,因?yàn)??它不做任何計(jì)算,只返回存儲(chǔ)在 zval 結(jié)構(gòu)(C 的內(nèi)置數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ) PHP 變量)中的字符串的已知長度。
但是,由于()是一個(gè)函數(shù),或多或少會(huì)慢一些,因?yàn)楹瘮?shù)調(diào)用會(huì)經(jīng)過很多步驟php 編程題 加法計(jì)算器,比如小寫字母,哈希查找,會(huì)和被調(diào)用的函數(shù)一起執(zhí)行。
在某些情況下,您可以使用 () 技巧來加速代碼的執(zhí)行。 例如:
if (($foo) < 5) { echo "Foo is too ";}// 使用 ()
if (!($foo{5})) { echo "Foo 太強(qiáng)了 ";}
1.7 分割字符串
() 在拆分字符串時(shí)比 () 快。
split()
0.001813 - 0.002271 seconds (avg 0.002042 seconds)
explode()
0.001678 - 0.003626 seconds (avg 0.002652 seconds)
1.8 echo 比
因?yàn)?echo 沒有返回值,它返回一個(gè)整數(shù)。
注意:當(dāng)echo輸出的字符串比較大時(shí),不調(diào)整會(huì)嚴(yán)重影響性能。
打開壓縮,或打開將內(nèi)容放入緩沖區(qū),可以改善性能問題。
2個(gè)陳述
2.1 最好不要用@
用 @ 屏蔽錯(cuò)誤會(huì)減慢腳本速度,并在后臺(tái)進(jìn)行大量額外工作。
與不使用@相比,效率差距是3倍。 特別是不要在循環(huán)中使用@。
5循環(huán)測試,即使先用(0)關(guān)閉報(bào)錯(cuò),循環(huán)完成后再打開,也比用@快。
2.2 避免使用魔術(shù)方法
以__開頭的函數(shù)稱為魔法函數(shù),它們都是在特定條件下觸發(fā)的。
這些魔法函數(shù)包括:()、()、()、()等。
以()為例,如果無法將類名與實(shí)際的磁盤文件相匹配,則需要進(jìn)行大量的文件存在性判斷。
而判斷文件是否存在需要磁盤I/O操作。 眾所周知,磁盤I/O操作的效率是很低的,所以這就是降低機(jī)制效率的原因。
因此,在設(shè)計(jì)系統(tǒng)時(shí),需要定義明確的類名到實(shí)際磁盤文件的映射機(jī)制。
規(guī)則越簡單明了,()機(jī)制的效率就越高。
該機(jī)制并非天生效率低下,只是自動(dòng)加載功能的濫用和設(shè)計(jì)不當(dāng)會(huì)導(dǎo)致其效率降低。
因此,盡量避免使用這種魔術(shù)方法是值得商榷的。
2.3 不要在循環(huán)中使用函數(shù)
例如:
for($x=0; $x < count($array); $x++) {
}
這種寫法每次循環(huán)都會(huì)調(diào)用()函數(shù),效率大大降低。 建議這樣做:
$len = count($array);
for($x=0; $x < $len; $x++) {
}
讓函數(shù)在循環(huán)外一次獲取循環(huán)計(jì)數(shù)。
2.4 使用三元運(yùn)算符
在簡單的判斷語句中,三元運(yùn)算符?:更加簡潔高效。
2.5 使用替代分支語句
, case 比使用多個(gè) if, else if 語句要好,代碼更易閱讀和維護(hù)。
2.6 屏蔽敏感信息
使用 () 函數(shù)可以防止向用戶顯示潛在的敏感信息。
理想情況下,應(yīng)該在 php.ini 文件中完全禁用錯(cuò)誤報(bào)告。
如果你使用的是共享虛擬主機(jī),php.ini不能修改,最好加上()函數(shù)。
放在每個(gè)腳本文件的第一行,或者用()加載,可以有效保護(hù)敏感的SQL查詢和路徑,出錯(cuò)時(shí)不會(huì)顯示。
2.7 不實(shí)用的 tags 鼓勵(lì)使用這種方法,可以使代碼更簡潔。
2.8 沒有關(guān)閉標(biāo)簽的純PHP代碼
如果文件內(nèi)容是純 PHP 代碼,最好去掉文件末尾的 PHP 結(jié)束標(biāo)記 ?>。
這可以防止在結(jié)束 PHP 標(biāo)記后意外包含空格或換行符,這會(huì)導(dǎo)致 PHP 在腳本無意輸出這些空格時(shí)開始輸出它們。
2.9 切勿使用和
這是兩個(gè)非常古老的特性,在當(dāng)時(shí)(十年前)可能是一個(gè)很好的方法,但現(xiàn)在似乎并非如此。
舊版本的 PHP 安裝時(shí)默認(rèn)打開這兩個(gè)功能,這可能會(huì)導(dǎo)致安全漏洞、編程錯(cuò)誤和其他問題。
例如,只有當(dāng)用戶輸入數(shù)據(jù)時(shí)才會(huì)創(chuàng)建變量等。
這兩個(gè)函數(shù)從PHP5.4.0開始就被廢棄了,所以每個(gè)程序員都應(yīng)該避免使用它們。
如果你過去的程序使用了這兩個(gè)函數(shù),請盡快將它們移除。
3個(gè)功能
3.1 嘗試使用PHP內(nèi)部函數(shù)
內(nèi)置函數(shù)用C語言實(shí)現(xiàn),并經(jīng)過PHP官方優(yōu)化,效率更高。
3.2 使用絕對路徑
嘗試在 和 中使用絕對路徑。
如果包含相對路徑,PHP 將遍歷內(nèi)部以查找該文件。
使用絕對路徑會(huì)避免此類問題php 編程題 加法計(jì)算器,并且解析路徑所需的時(shí)間會(huì)更少。
3.3 包含文件
盡量不要使用和文件,他們多了一個(gè)判斷文件是否被引用的過程,盡量不要使用。
并使用, 方法代替。
鳥哥在博客中多次聲明盡量不要使用 and 。
3.4 函數(shù)比類方法快
調(diào)用一個(gè)只有一個(gè)參數(shù)且函數(shù)體為空的函數(shù)所花費(fèi)的時(shí)間相當(dāng)于 7-8 次 $++ 操作。
具有相同功能的類方法大約是15個(gè)$++操作。
3.5 使用子類方法
只有可重用的方法放在基類中,其他功能盡量在子類中實(shí)現(xiàn)。 子類中方法的性能優(yōu)于基類中的方法。
3.6 一個(gè)類的性能與方法的數(shù)量無關(guān)
在測試類中添加 10 個(gè)或更多新方法后,性能沒有差異。
3.7 讀取文件內(nèi)容
當(dāng)可以用()代替file()、()、feof()、()等系列方法時(shí),盡量使用()。
因?yàn)樗矢撸?/p>
3.8 通過引用傳遞參數(shù)
通過參數(shù)地址引用的方式,實(shí)現(xiàn)了函數(shù)的多個(gè)返回值,比傳值更高效。
方法是在參數(shù)變量前加一個(gè)&。
3.9 方法不宜細(xì)分太多
仔細(xì)想想你真正要重用的代碼是什么?
3.10 盡量保持靜態(tài)
如果一個(gè)方法可以是靜態(tài)的,那么聲明它是靜態(tài)的,速度可以提高1/4,甚至我測試的時(shí)候,這提高了將近三倍。
當(dāng)然,這個(gè)測試方法需要在10萬級以上執(zhí)行,效果才會(huì)明顯。
事實(shí)上,靜態(tài)方法和非靜態(tài)方法的效率的主要區(qū)別在于內(nèi)存。
靜態(tài)方法在程序開始時(shí)產(chǎn)生內(nèi)存,實(shí)例方法(非靜態(tài)方法)在程序運(yùn)行時(shí)產(chǎn)生內(nèi)存。
所以靜態(tài)方法可以直接調(diào)用,而實(shí)例方法在調(diào)用前需要生成一個(gè)實(shí)例。 靜態(tài)的速度很快,但是多了會(huì)占內(nèi)存。
任何語言都在內(nèi)存和磁盤上運(yùn)行。 至于是否面向?qū)ο螅皇擒浖拥膯栴}。 底層是一樣的,只是實(shí)現(xiàn)方式不同。
靜態(tài)內(nèi)存是連續(xù)的,因?yàn)樗窃诔绦蛞婚_始就產(chǎn)生的網(wǎng)站模板,而實(shí)例方法申請的是離散空間,當(dāng)然不如靜態(tài)方法快。
靜態(tài)方法總是調(diào)用同一塊內(nèi)存,缺點(diǎn)是不能自動(dòng)銷毀,但實(shí)例化可以銷毀。
3.11 C擴(kuò)展的實(shí)現(xiàn)
如果代碼中有很多耗時(shí)函數(shù),可以考慮用C擴(kuò)展來實(shí)現(xiàn)。
4個(gè)變量
4.1 及時(shí)銷毀變量
數(shù)組、對象、變量在PHP中占用內(nèi)存較多,這是PHP底層的zend引擎造成的。
一般來說,PHP數(shù)組的內(nèi)存利用率只有1/10。
也就是說在C語言中一個(gè)100M內(nèi)存的數(shù)組在PHP中需要1G。
特別是在使用PHP作為后臺(tái)服務(wù)器的系統(tǒng)中,經(jīng)常會(huì)出現(xiàn)內(nèi)存消耗過大的問題。
4.2 使用$變量
如果需要獲取腳本執(zhí)行時(shí)間,$[''] 比time()更好。
一個(gè)是現(xiàn)成的,可以直接使用,一個(gè)是需要函數(shù)的結(jié)果。
4.3 方法中建立騰云網(wǎng)絡(luò)
在類的方法中建立騰云網(wǎng)絡(luò)是最快的,幾乎和在方法中調(diào)用騰云網(wǎng)絡(luò)一樣快。
4.4 騰云網(wǎng)絡(luò)比全局變量更快
因?yàn)轵v云網(wǎng)絡(luò)存在于棧中。
當(dāng)一個(gè)函數(shù)占用的棧空間不是很大的時(shí)候,這部分內(nèi)存很可能被打的一干二凈,CPU訪問的效率很高。
反之,如果一個(gè)函數(shù)同時(shí)使用全局變量和騰云網(wǎng)絡(luò),當(dāng)兩個(gè)地址相差較大時(shí),CPU需要來回切換,效率會(huì)下降。
4.5 騰云網(wǎng)絡(luò)代替對象屬性
創(chuàng)建對象屬性(類中的變量網(wǎng)站優(yōu)化,例如:$this->prop++)比騰云網(wǎng)絡(luò)慢3倍。