PHP 效能分析與實驗 效能的巨集觀分析

2021-08-02 14:03:51 字數 1210 閱讀 2494

摘要: 【編者按】此前,閱讀過了很多關於 php 效能分析的文章,不過寫的都是一條一條的規則,而且,這些規則並沒有上下文,也沒有明確的實驗來體現出這些規則的優勢,同時討論的也側重於一些語法要點。本文就改變 php 效能分析的角度,並通過例項來分析出 php 的效能方面需要注意和改進的點。

【編者按】此前,閱讀過了很多關於 php 效能分析的文章,不過寫的都是一條一條的規則,而且,這些規則並沒有上下文,也沒有明確的實驗來體現出這些規則的優勢,同時討論的也側重於一些語法要點。本文就改變 php 效能分析的角度,並通過例項來分析出 php 的效能方面需要注意和改進的點。

對 php 效能的分析,我們從兩個層面著手,把這篇文章也分成了兩個部分,乙個是巨集觀層面,所謂巨集觀層面,就是 php 語言本身和環境層面,乙個是應用層面,就是語法和使用規則的層面,不過不僅**規則,更輔助以示例的分析。

巨集觀層面,也就是對 php 語言本身的效能分析又分為三個方面:

php 作為解釋性語言效能有其天然的缺陷

php 作為動態型別語言在效能上也有提公升的空間

當下主流 php 版本本身語言引擎效能

php 作為一門指令碼語言,也是解釋性語言,是其天然效能受限的原因,因為同編譯型語言在執行之前編譯成二進位制**不同,解釋性語言在每一次執行都面對原始指令碼的輸入、解析、編譯,然後執行。如下是 php 作為解釋性語言的執行過程。

圖1、php 語言解析執行過程

如上所示,從上圖可以看到,每一次執行,都需要經歷三個解析、編譯、執行三個過程。

那優化的點在**呢?可以想見,只要**檔案確定,解析到編譯這一步都是確定的,因為檔案已不再變化,而執行,則由於輸入引數的不同而不同。在效能優化的世界裡,至上絕招就是在獲得同樣結果的情況下,減少操作,這就是大名鼎鼎的快取。快取無處不在,快取也是效能優化的殺手鐗。於是乎 opcode 快取這一招就出現了,只有第一次需要解析和編譯,而在後面的執行中,直接由指令碼到 opcode,從而實現了效能提速。執行流程如下圖所示:

圖2. 啟用了 opcode 快取的 php 執行過程

相對每一次解析、編譯,讀到指令碼之後,直接從快取讀取位元組碼的效率會有大幅度的提公升,提公升幅度到底有多大呢?

我們來做乙個沒有 opcode 快取的實驗。20 個併發,總共 10000 次請求沒有經過 opcode 快取的請求,,得到如下結果:

PHP 效能分析與實驗

對 php 效能的分析,我們從兩個層面著手,把這篇文章也分成了兩個部分,乙個是巨集觀層面,所謂巨集觀層面,就是 php 語言本身和環境層面,乙個是應用層面,就是語法和使用規則的層面,不過不僅 規則,更輔助以示例的分析。巨集觀層面,也就是對 php 語言本身的效能分析又分為三個方面 php 作為解釋性...

PHP 效能分析與實驗

對 php 效能的分析,我們從兩個層面著手,把這篇文章也分成了兩個部分,乙個是巨集觀層面,所謂巨集觀層面,就是 php 語言本身和環境層面,乙個是應用層面,就是語法和使用規則的層面,不過不僅 規則,更輔助以示例的分析。巨集觀層面,也就是對 php 語言本身的效能分析又分為三個方面 php 作為解釋性...

排序演算法效能分析實驗

掌握選擇排序 氣泡排序 合併排序 快速排序 插入排序演算法原理 掌握不同排序演算法時間效率的經驗分析方法,驗證理論分析與經驗分析的一致性。現在有10億的資料 每個資料四個位元組 請快速挑選出最大的十個數,並在小規模資料上驗證演算法的正確性。排序不多說,講一下第3點。3是經典的topk問題,這麼大的資...