亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > PHP > 正文

百度工程師講PHP函數的實現原理及性能分析(一

2020-03-22 20:01:34
字體:
來源:轉載
供稿:網友
前言在任何語言中,函數都是最基本的組成單元。對于php的函數,它具有哪些特點?函數調用是怎么實現的?php函數的性能如何,有什么使用建議?本文將從原理出發進行分析結合實際的性能測試嘗試對這些問題進行回答,在了解實現的同時更好的編寫php程序。同時也會對一些常見的php函數進行介紹。php函數的分類在php中,橫向劃分的話,函數分為兩大類: user function(內置函數) 和internal function(內置函數)。前者就是用戶在程序中自定義的一些函數和方法,后者則是php本身提供的各類庫函數(比如sprintf、array_push等)。用戶也可以通過擴展的方法來編寫庫函數,這個將在后面介紹。對于user function,又可以細分為function(函數)和method(類方法),本文中將就這三種函數分別進行分析和測試。php函數的實現一個php函數最終是如何執行,這個流程是怎么樣的呢?
要回答這個問題,我們先來看看php代碼的執行所經過的流程。從圖1可以看到,php實現了一個典型的動態語言執行過程:拿到一段代碼后,經過詞法解析、語法解析等階段后,源程序會被翻譯成一個個指令(opcodes),然后ZEND虛擬機順次執行這些指令完成操作。Php本身是用c實現的,因此最終調用的也都是c的函數,實際上,我們可以把php看做是一個c開發的軟件。通過上面描述不難看出,php中函數的執行也是被翻譯成了opcodes來調用,每次函數調用實際上是執行了一條或多條指令。對于每一個函數,zend都通過以下的數據結構來描述
復制代碼 代碼如下:
typedef union _zend_function {
zend_uchar type; /* MUST be the first element of this struct! */
struct {
zend_uchar type; /* never used */
char *function_name;
zend_html' target='_blank'>class_entry *scope;
zend_uint fn_flags;
union _zend_function *prototype;
zend_uint num_args;
zend_uint required_num_args;
zend_arg_info *arg_info;
zend_bool pass_rest_by_reference;
unsigned char return_reference;
} common;zend_op_array op_array;
zend_internal_function internal_function;
} zend_function;
typedef struct _zend_function_state {
HashTable *function_symbol_table;
zend_function *function;
void *reserved[ZEND_MAX_RESERVED_RESOURCES];
} zend_function_state;
其中type標明了函數的類型:用戶函數、內置函數、重載函數。Common中包含函數的基本信息,包括函數名,參數信息,函數標志(普通函數、靜態方法、抽象方法)等內容。另外,對于用戶函數,還有一個函數符號表,記錄了內部變量等,這個將在后面詳述。 Zend維護了一個全局function_table,這是一個大的hahs表。函數調用的時候會首先根據函數名從表中找到對應的zend_function。當進行函數調用時候,虛擬機會根據type的不同決定調用方法, 不同類型的函數,其執行原理是不相同的 。內置函數內置函數,其本質上就是真正的c函數,每一個內置函數,php在最終編譯后都會展開成為一個名叫zif_xxxx的function,比如我們常見的sprintf,對應到底層就是zif_sprintf。Zend在執行的時候,如果發現是內置函數,則只是簡單的做一個轉發操作。
Zend提供了一系列的api供調用,包括參數獲取、數組操作、內存分配等。內置函數的參數獲取,通過zend_parse_parameters方法來實現,對于數組、字符串等參數,zend實現的是淺拷貝,因此這個效率是很高的。可以這樣說,對于php內置函數,其效率和相應c函數幾乎相同,唯一多了一次轉發調用。內置函數在php中都是通過so的方式進行動態加載,用戶也可以根據需要自己編寫相應的so,也就是我們常說的擴展。ZEND提供了一系列的api供擴展使用用戶函數和內置函數相比,用戶通過php實現的自定義函數具有完全不同的執行過程和實現原理。如前文所述,我們知道php代碼是被翻譯成為了一條條opcode來執行的,用戶函數也不例外,實際中每個函數對應到一組opcode,這組指令被保存在zend_function中。于是,用戶函數的調用最終就是對應到一組opcodes的執行。》》局部變量的保存及遞歸的實現我們知道,函數遞歸是通過堆棧來完成的。在php中,也是利用類似的方法來實現。Zend為每個php函數分配了一個活動符號表(active_sym_table),記錄當前函數中所有局部變量的狀態。所有的符號表通過堆棧的形式來維護,每當有函數調用的時候,分配一個新的符號表并入棧。當調用結束后當前符號表出棧。由此實現了狀態的保存和遞歸。
對于棧的維護,zend在這里做了優化。預先分配一個長度為N的靜態數組來模擬堆棧,這種通過靜態數組來模擬動態數據結構的手法在我們自己的程序中也經常有使用,這種方式避免了每次調用帶來的內存分配、銷毀。ZEND只是在函數調用結束時將當前棧頂的符號表數據clean掉即可。因為靜態數組長度為N,一旦函數調用層次超過N,程序不會出現棧溢出,這種情況下zend就會進行符號表的分配、銷毀,因此會導致性能下降很多。在zend里面,N目前取值是32。因此,我們編寫php程序的時候,函數調用層次最好不要超過32。當然,如果是web應用,本身可以函數調用層次的深度。》》參數的傳遞 和內置函數調用zend_parse_params來獲取參數不同,用戶函數中參數的獲取是通過指令來完成的。函數有幾個參數就對應幾條指令。具體到實現上就是普通的變量賦值。通過上面的分析可以看出,和內置函數相比,由于是自己維護堆棧表,而且每條指令的執行也是一個c函數,用戶函數的性能相對會差很多,后面會有具體的對比分析。因此,如果一個功能有對應php內置函數實現的盡量不要自己重新寫函數去實現。
PHP教程

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩免费在线看| 久久久久久国产三级电影| 在线观看精品国产视频| 亚洲国产婷婷香蕉久久久久久| 亚洲精品不卡在线| 欧美美女18p| 91高潮在线观看| 精品偷拍各种wc美女嘘嘘| 亚洲欧美日韩国产中文| 91精品免费久久久久久久久| 精品国产31久久久久久| 一区二区三区 在线观看视| 精品久久在线播放| 欧美视频中文在线看| 国产在线不卡精品| xvideos亚洲人网站| 午夜免费久久久久| 91精品国产九九九久久久亚洲| 欧美精品亚州精品| 欧美洲成人男女午夜视频| 高清在线视频日韩欧美| 国产91露脸中文字幕在线| 国产精品扒开腿做爽爽爽视频| 成人av资源在线播放| 亚洲影院污污.| 国产剧情日韩欧美| 日韩精品电影网| 国产精品va在线播放| 亚洲激情免费观看| 成人精品视频久久久久| 亚洲美女av黄| 欧美裸体xxxx极品少妇| 日韩电影大片中文字幕| 国产精品中文字幕久久久| 日日骚久久av| 亚洲国产精品成人一区二区| 一区二区三区国产在线观看| 欧美亚洲另类激情另类| 清纯唯美亚洲综合| 欧美做爰性生交视频| 在线播放亚洲激情| 国产精品网红福利| 成人激情视频在线播放| 亚洲成**性毛茸茸| 日日骚久久av| 国产日韩换脸av一区在线观看| 亚洲人午夜精品| 精品福利免费观看| 亚洲免费成人av电影| 日韩中文字幕在线视频| 亚洲国产精品福利| 深夜福利日韩在线看| 亚洲аv电影天堂网| 色偷偷噜噜噜亚洲男人| 欧美xxxx做受欧美.88| 精品久久中文字幕久久av| 国产亚洲精品久久久| 91豆花精品一区| 国产精品第一视频| 久久精品99久久香蕉国产色戒| 国产国语videosex另类| 最近更新的2019中文字幕| 中日韩午夜理伦电影免费| 北条麻妃一区二区三区中文字幕| 国产精品国语对白| 麻豆国产精品va在线观看不卡| 国产亚洲精品美女久久久久| 国产精品一区二区在线| 中文字幕在线精品| 国产精品视频公开费视频| 欧美成人性色生活仑片| 久久精品亚洲热| 亚洲欧美国产一本综合首页| 96pao国产成视频永久免费| 日本精品一区二区三区在线| 成人做爰www免费看视频网站| 亚洲一区二区在线播放| 国产一区红桃视频| 欧美国产日韩一区二区三区| 日韩在线中文字| 欧美成年人视频网站欧美| 亚洲xxxx做受欧美| 北条麻妃99精品青青久久| 久久人人爽人人爽爽久久| 日韩国产在线看| 亚洲激情视频在线| 成人性生交大片免费看小说| 久久视频国产精品免费视频在线| 亚洲国产毛片完整版| 久久天天躁日日躁| 色妞一区二区三区| 久久精品亚洲94久久精品| 高清欧美性猛交xxxx| 国产精品视频男人的天堂| 中文字幕在线成人| 欧美激情a在线| 亚洲第五色综合网| 国产一区二区精品丝袜| 欧美日韩国产91| 黑丝美女久久久| 精品一区二区电影| 欧美国产一区二区三区| www.亚洲一区| 91视频国产高清| 欧美日韩在线免费观看| 国产高清在线不卡| 久久久久久18| 亚洲欧洲午夜一线一品| 97久久精品视频| 中文字幕亚洲一区在线观看| 免费99精品国产自在在线| 久久久久国产一区二区三区| 九九九久久国产免费| 国产午夜精品一区理论片飘花| 91成人在线视频| 色播久久人人爽人人爽人人片视av| 欧美日韩亚洲成人| 国产精品无av码在线观看| 亚洲精品一区二区网址| 亚洲最大成人网色| 成人av在线亚洲| 久久久久久欧美| 久久青草福利网站| 欧美丝袜美女中出在线| 国产午夜精品全部视频在线播放| 国产精品视频一区二区三区四| 91老司机精品视频| 亚洲福利精品在线| 久久久久久久一| 亚洲国产精品专区久久| 欧美一区亚洲一区| 97在线视频观看| 欧美亚洲视频在线观看| 欧美性少妇18aaaa视频| 成人日韩av在线| 久久五月天色综合| 亚洲国产精品小视频| 成人黄色免费在线观看| 8090理伦午夜在线电影| 国产一区二区三区视频免费| 日韩大陆欧美高清视频区| 欧美亚洲在线观看| 久久精品国产91精品亚洲| 欧美一级淫片videoshd| 国产精品狼人色视频一区| 国产自摸综合网| 狠狠躁天天躁日日躁欧美| 中文字幕日韩欧美在线视频| 日本久久精品视频| 狠狠色狠狠色综合日日小说| 亚洲一级片在线看| 国产精品18久久久久久首页狼| 国内精品视频在线| 亚洲精品成人免费| 国产欧美日韩视频| 成人黄色短视频在线观看| 精品国产一区二区三区久久狼黑人| 成人欧美一区二区三区在线湿哒哒| 97国产精品视频| 亚洲风情亚aⅴ在线发布| 中文字幕日韩视频| 日韩中文字幕在线视频| 精品中文字幕视频| 亚洲天堂开心观看|