PHP7革新與性能優化

2020-11-22 CSDN技術社區

有幸參與2015年的PHP技術峰會(PHPCON),聽了鳥哥(惠新宸)的關於PHP7的新特性和性能優化的分享,一切都令人感到激動。鳥哥是國內最權威的PHP專家,他的分享有很多非常有價值的東西,我通過整理分享的PPT和收集相關資料,整理為這篇解讀性質的技術文章,希望能給做PHP開發的同學一些幫助。

PHP已經走過了20年的歷史,直到今天,PHP7都發布了RC版,據說,PHP7正式版應該會在2015年11月份左右發布。PHP7對於上一個系列的PHP5.*,可以說是一個大規模的革新,尤其是在性能方面實現跨越式的大幅提升。

PHP是一種在全球範圍內被廣泛使用的Web開發語言,PHP7的革新也當然會給這些Web服務帶來更深刻的變化。這裡引用鳥哥PPT中的一個圖表(82%的Web站點有使用PHP作為開發語言):


(註:一個web站點可以會使用多種語言作為它的開發語言)

(註:本文含有不少從鳥哥PPT裡的截圖,圖片版權歸鳥哥所有)

我們先看看兩張激動人心的性能測試結果圖:

Benchmark對比(圖片來自於PPT):


PHP7的性能測試結果,性能壓測結果,耗時從2.991下降到1.186,大幅度下降60%。

WordPress的QPS壓測(圖片來自於PPT):


而在WordPress項目中,PHP7對比PHP5.6,QPS提升2.77倍。

看完令人激動的性能測試結果對比,我們就進入正題哈。PHP7的新增特性很多,不過,我們會更聚焦於那些主要的變化。

一、新增特性和改變

1. 標量類型和返回類型聲明(Scalar Type Declarations & Scalar Type Declarations)

PHP語言一個非常重要的特點就是「弱類型」,它讓PHP的程序變得非常容易編寫,新手接觸PHP能夠快速上手,不過,它也伴隨著一些爭議。支持變量類型的定義,可以說是革新性質的變化,PHP開始以可選的方式支持類型定義。除此之外,還引入了一個開關指令declare(strict_type=1);,當這個指令一旦開啟,將會強制當前文件下的程序遵循嚴格的函數傳參類型和返回類型。

例如一個add函數加上類型定義,可以寫成這樣:


如果配合強制類型開關指令,則可以變為這樣:


如果不開啟strict_type,PHP將會嘗試幫你轉換成要求的類型,而開啟之後,會改變PHP就不再做類型轉換,類型不匹配就會拋出錯誤。對於喜歡「強類型」語言的同學來說,這是一大福音。

更為詳細的介紹:PHP7標量類型聲明RFC[翻譯>

2. 更多的Error變為可捕獲的Exception

PHP7實現了一個全局的throwable接口,原來的Exception和部分Error都實現了這個接口(interface), 以接口的方式定義了異常的繼承結構。於是,PHP7中更多的Error變為可捕獲的Exception返回給開發者,如果不進行捕獲則為Error,如果捕獲就變為一個可在程序內處理的Exception。這些可被捕獲的Error通常都是不會對程序造成致命傷害的Error,例如函數不存。PHP7進一步方便開發者處理,讓開發者對程序的掌控能力更強。因為在默認情況下,Error會直接導致程序中斷,而PHP7則提供捕獲並且處理的能力,讓程序繼續執行下去,為程式設計師提供更靈活的選擇。

例如,執行一個我們不確定是否存在的函數,PHP5兼容的做法是在函數被調用之前追加的判斷function_exist,而PHP7則支持捕獲Exception的處理方式。

如下圖中的例子(截圖來源於PPT內):


3. AST(Abstract Syntax Tree,抽象語法樹)

AST在PHP編譯過程作為一個中間件的角色,替換原來直接從解釋器吐出opcode的方式,讓解釋器(parser)和編譯器(compliler)解耦,可以減少一些Hack代碼,同時,讓實現更容易理解和可維護。

PHP 5:


PHP 7:


更多AST信息:https://wiki.php.net/rfc/abstract_syntax_tree

4. Native TLS(Native Thread local storage,原生線程本地存儲)

PHP在多線程模式下(例如,Web伺服器Apache的woker和event模式,就是多線程),需要解決「線程安全」(TS,Thread Safe)的問題,因為線程是共享進程的內存空間的,所以每個線程本身需要通過某種方式,構建私有的空間來保存自己的私有數據,避免和其他線程相互汙染。而PHP5採用的方式,就是維護一個全局大數組,為每一個線程分配一份獨立的存儲空間,線程通過各自擁有的key值來訪問這個全局數據組。

而這個獨有的key值在PHP5中需要傳遞給每一個需要用到全局變量的函數,PHP7認為這種傳遞的方式並不友好,並且存在一些問題。因而,嘗試採用一個全局的線程特定變量來保存這個key值。

相關的Native TLS問題:https://wiki.php.net/rfc/native-tls

5. 其他新特性

PHP 7新特性和變化不少,我們這裡並不全部展開來細說哈。

  1. Int64支持,統一不同平臺下的整型長度,字符串和文件上傳都支持大於2GB。
  2. 統一變量語法(Uniform variable syntax)。
  3. foreach表現行為一致(Consistently foreach behaviors)
  4. 新的操作符 <=>, ??
  5. Unicode字符格式支持(\u{xxxxx})
  6. 匿名類支持(Anonymous Class)

……

二、跨越式的性能突破:全速前進

1.  JIT與性能

Just In Time(即時編譯)是一種軟體優化技術,指在運行時才會去編譯字節碼為機器碼。從直覺出發,我們都很容易認為,機器碼是計算機能夠直接識別和執行的,比起Zend讀取opcode逐條執行效率會更高。其中,HHVM(HipHop Virtual Machine,HHVM是一個Facebook開源的PHP虛擬機)就採用JIT,讓他們的PHP性能測試提升了一個數量級,放出一個令人震驚的測試結果,也讓我們直觀地認為JIT是一項點石成金的強大技術。

而實際上,在2013年的時候,鳥哥和Dmitry(PHP語言內核開發者之一)就曾經在PHP5.5的版本上做過一個JIT的嘗試(並沒有發布)。PHP5.5的原來的執行流程,是將PHP代碼通過詞法和語法分析,編譯成opcode字節碼(格式和彙編有點像),然後,Zend引擎讀取這些opcode指令,逐條解析執行。


而他們在opcode環節後引入了類型推斷(TypeInf),然後通過JIT生成ByteCodes,然後再執行。


於是,在benchmark(測試程序)中得到令人興奮的結果,實現JIT後性能比PHP5.5提升了8倍。然而,當他們把這個優化放入到實際的項目WordPress(一個開源博客項目)中,卻幾乎看不見性能的提升,得到了一個令人費解的測試結果。

於是,他們使用Linux下的profile類型工具,對程序執行進行CPU耗時佔用分析。

執行100次WordPress的CPU消耗的分布(截圖來自PPT):


註解:

21%CPU時間花費在內存管理。

12%CPU時間花費在hash table操作,主要是PHP數組的增刪改查。

30%CPU時間花費在內置函數,例如strlen。

25%CPU時間花費在VM(Zend引擎)。

經過分析之後,得到了兩個結論:

(1)JIT生成的ByteCodes如果太大,會引起CPU緩存命中率下降(CPU Cache Miss)

在PHP5.5的代碼裡,因為並沒有明顯類型定義,只能靠類型推斷。儘可能將可以推斷出來的變量類型,定義出來,然後,結合類型推斷,將非該類型的分支代碼去掉,生成直接可執行的機器碼。然而,類型推斷不能推斷出全部類型,在WordPress中,能夠推斷出來的類型信息只有不到30%,能夠減少的分支代碼有限。導致JIT以後,直接生成機器碼,生成的ByteCodes太大,最終引起CPU緩存命中大幅度下降(CPU Cache Miss)。

CPU緩存命中是指,CPU在讀取並執行指令的過程中,如果需要的數據在CPU一級緩存(L1)中讀取不到,就不得不往下繼續尋找,一直到二級緩存(L2)和三級緩存(L3),最終會嘗試到內存區域裡尋找所需要的指令數據,而內存和CPU緩存之間的讀取耗時差距可以達到100倍級別。所以,ByteCodes如果過大,執行指令數量過多,導致多級緩存無法容納如此之多的數據,部分指令將不得不被存放到內存區域。


CPU的各級緩存的大小也是有限的,下圖是Intel i7 920的配置信息:


因此,CPU緩存命中率下降會帶來嚴重的耗時增加,另一方面,JIT帶來的性能提升,也被它所抵消掉了。

通過JIT,可以降低VM的開銷,同時,通過指令優化,可以間接降低內存管理的開發,因為可以減少內存分配的次數。然而,對於真實的WordPress項目來說,CPU耗時只有25%在VM上,主要的問題和瓶頸實際上並不在VM上。因此,JIT的優化計劃,最後沒有被列入該版本的PHP7特性中。不過,它很可能會在更後面的版本中實現,這點也非常值得我們期待哈。

(2)JIT性能的提升效果取決於項目的實際瓶頸

JIT在benchmark中有大幅度的提升,是因為代碼量比較少,最終生成的ByteCodes也比較小,同時主要的開銷是在VM中。而應用在WordPress實際項目中並沒有明顯的性能提升,原因WordPress的代碼量要比benchmark大得多,雖然JIT降低了VM的開銷,但是因為ByteCodes太大而又引起CPU緩存命中下降和額外的內存開銷,最終變成沒有提升。

不同類型的項目會有不同的CPU開銷比例,也會得到不同的結果,脫離實際項目的性能測試,並不具有很好的代表性。

2. Zval的改變

PHP的各種類型的變量,其實,真正存儲的載體就是Zval,它特點是海納百川,有容乃大。從本質上看,它是C語言實現的一個結構體(struct)。對於寫PHP的同學,可以將它粗略理解為是一個類似array數組的東西。

PHP5的Zval,內存佔據24個字節(截圖來自PPT):


PHP7的Zval,內存佔據16個字節(截圖來自PPT):


Zval從24個字節下降到16個字節,為什麼會下降呢,這裡需要補一點點的C語言基礎,輔助不熟悉C的同學理解。struct和union(聯合體)有點不同,Struct的每一個成員變量要各自佔據一塊獨立的內存空間,而union裡的成員變量是共用一塊內存空間(也就是說修改其中一個成員變量,公有空間就被修改了,其他成員變量的記錄也就沒有了)。因此,雖然成員變量看起來多了不少,但是實際佔據的內存空間卻下降了。

除此之外,還有被明顯改變的特性,部分簡單類型不再使用引用。

Zval結構圖(來源於PPT中):


圖中Zval的由2個64bits(1位元組=8bit,bit是「位」)組成,如果變量類型是long、bealoon這些長度不超過64bit的,則直接存儲到value中,就沒有下面的引用了。當變量類型是array、objec、string等超過64bit的,value存儲的就是一個指針,指向真實的存儲結構地址。

對於簡單的變量類型來說,Zval的存儲變得非常簡單和高效。

不需要引用的類型:NULL、Boolean、Long、Double

需要引用的類型:String、Array、Object、Resource、Reference

3. 內部類型zend_string

Zend_string是實際存儲字符串的結構體,實際的內容會存儲在val(char,字符型)中,而val是一個char數組,長度為1(方便成員變量佔位)。


結構體最後一個成員變量採用char數組,而不是使用char*,這裡有一個小優化技巧,可以降低CPU的cache miss。

如果使用char數組,當malloc申請上述結構體內存,是申請在同一片區域的,通常是長度是sizeof(_zend_string) + 實際char存儲空間。但是,如果使用char*,那個這個位置存儲的只是一個指針,真實的存儲又在另外一片獨立的內存區域內。

使用char[1>和char*的內存分配對比:


從邏輯實現的角度來看,兩者其實也沒有多大區別,效果很類似。而實際上,當這些內存塊被載入到CPU的中,就顯得非常不一樣。前者因為是連續分配在一起的同一塊內存,在CPU讀取時,通常都可以一同獲得(因為會在同一級緩存中)。而後者,因為是兩塊內存的數據,CPU讀取第一塊內存的時候,很可能第二塊內存數據不在同一級緩存中,使CPU不得不往L2(二級緩存)以下尋找,甚至到內存區域查到想要的第二塊內存數據。這裡就會引起CPU Cache Miss,而兩者的耗時最高可以相差100倍。

另外,在字符串複製的時候,採用引用賦值,zend_string可以避免的內存拷貝。

4. PHP數組的變化(HashTable和Zend Array)

在編寫PHP程序過程中,使用最頻繁的類型莫過於數組,PHP5的數組採用HashTable實現。如果用比較粗略的概括方式來說,它算是一個支持雙向鍊表的HashTable,不僅支持通過數組的key來做hash映射訪問元素,也能通過foreach以訪問雙向鍊表的方式遍歷數組元素。

PHP5的HashTable(截圖來自於PPT):


這個圖看起來很複雜,各種指針跳來跳去,當我們通過key值訪問一個元素內容的時候,有時需要3次的指針跳躍才能找對需要的內容。而最重要的一點,就在於這些數組元素存儲,都是分散在各個不同的內存區域的。同理可得,在CPU讀取的時候,因為它們就很可能不在同一級緩存中,會導致CPU不得不到下級緩存甚至內存區域查找,也就是引起CPU緩存命中下降,進而增加更多的耗時。

PHP7的Zend Array(截圖來源於PPT):


新版本的數組結構,非常簡潔,讓人眼前一亮。最大的特點是,整塊的數組元素和hash映射表全部連接在一起,被分配在同一塊內存內。如果是遍歷一個整型的簡單類型數組,效率會非常快,因為,數組元素(Bucket)本身是連續分配在同一塊內存裡,並且,數組元素的zval會把整型元素存儲在內部,也不再有指針外鏈,全部數據都存儲在當前內存區域內。當然,最重要的是,它能夠避免CPU Cache Miss(CPU緩存命中率下降)。

Zend Array的變化:

  1. 數組的value默認為zval。
  2. HashTable的大小從72下降到56位元組,減少22%。
  3. Buckets的大小從72下降到32位元組,減少50%。
  4. 數組元素的Buckets的內存空間是一同分配的。
  5. 數組元素的key(Bucket.key)指向zend_string。
  6. 數組元素的value被嵌入到Bucket中。
  7. 降低CPU Cache Miss。

5. 函數調用機制(Function Calling Convention)

PHP7改進了函數的調用機制,通過優化參數傳遞的環節,減少了一些指令,提高執行效率。

PHP5的函數調用機制(截圖來自於PPT):


圖中,在vm棧中的指令send_val和recv參數的指令是相同,PHP7通過減少這兩條重複,來達到對函數調用機制的底層優化。

PHP7的函數調用機制(截圖來自於PPT):


6. 通過宏定義和內聯函數(inline),讓編譯器提前完成部分工作

C語言的宏定義會被在預處理階段(編譯階段)執行,提前將部分工作完成,無需在程序運行時分配內存,能夠實現類似函數的功能,卻沒有函數調用的壓棧、彈棧開銷,效率會比較高。內聯函數也類似,在預處理階段,將程序中的函數替換為函數體,真實運行的程序執行到這裡,就不會產生函數調用的開銷。

PHP7在這方面做了不少的優化,將不少需要在運行階段要執行的工作,放到了編譯階段。例如參數類型的判斷(Parameters Parsing),因為這裡涉及的都是固定的字符常量,因此,可以放到到編譯階段來完成,進而提升後續的執行效率。

例如下圖中處理傳遞參數類型的方式,從左邊的寫法,優化為右邊宏的寫法。


三、小結

鳥哥的PPT裡放出過一組對比數據,就是WordPress在PHP5.6執行100次會產生70億次的CPU指令執行數目,而在PHP7中只需要25億次,減少64.2%,這是一個令人震撼的數據。

在鳥哥的整個分享中,給我最深刻的一個觀點是:要注意細節,很多個細小的優化,一點點持續地積累,積少成多,最終匯聚為驚豔的成果。為山九仞,豈一日之功,我想大概也是這個道理。

毫無疑問,PHP7在性能方面實現跨越式的提升,如果能夠將這些成果應用在PHP的Web系統中,也許我們只需要更少的機器,就可以支撐起更高請求量的服務。PHP7正式版的發布,令人充滿無限憧憬。

參考&引用資料:鳥哥(惠新宸)的分享PPT,http://www.laruence.com/,http://php.net/

致謝:感謝鳥哥(惠新宸)提供的幫助與支持。

作者介紹:徐漢彬,現任騰訊SNG增值產品部高級工程師,QQ會員AMS運營平臺技術負責人,2015年中國PHPCON技術大會分享嘉賓之一,曾就職於阿里巴巴、小滿科技(創業公司)。

本文為CSDN原創文章,未經允許不得轉載,如需轉載請聯繫market#csdn.net(#換成@)

相關焦點

  • 性能優化知識圖譜
    :whatis9527want】經微信公眾號授權轉載,如需轉載與原文作者聯繫先列個提綱,後面補充內容## 一、關注和度量### 關注- 優化執行效率- 優化內存佔用- 優化IO- 磁碟IO- 網絡IO### 度量- 吞吐量- 響應時間(Response
  • 「聲子液體」優化熱電性能
    中科院上海矽酸鹽所研究員史迅、陳立東、張文清、許鍅鍅與美國加州理工大學等機構的學者合作,提出在固態材料中引入具有局域「液態」特徵的離子來降低熱導率和優化熱電性能
  • 宜蘭市301疊螺機發展與革新
    宜蘭市301疊螺機發展與革新   宜興市森諾特環保是生產301疊螺機、疊螺汙泥脫水機和疊螺式汙泥脫水機的301疊螺機廠家,歡迎廣大客戶前來參觀考察,共同為環保事業做一份貢獻。
  • Python代碼性能調試和優化
    一直以來Python性能是遭人詬病的問題之一,抱怨執行慢,沒法用。雖然再性能上語言的差異確實存在著明顯差異,但是我認為一個非常流行的語言,運行的快慢不會成為阻擾人們使用的因素。如果是的話,可能是由於編寫的程序有問題,需要優化。本文蟲蟲就給大家介紹一下如何調試Python應用的性能,以及怎麼對其進行優化。
  • SOLIDWORKS大型裝配體性能優化方法
    在一些做自動化設備的客戶,隨著需求的不斷提升,大型裝配體性能一致是客戶十分關注一個問題,很多客戶頭疼於大型裝體整線的裝配,試想一臺設備通常有5000+的零件,那麼把幾臺設備連線,總零部件數量已經達到幾萬個,這對電腦的性能是十分艱巨的考驗,我們知道SOLIDWORKS只支持單核單線程
  • 開啟攪拌器葉輪的水力性能優化
    開啟攪拌器葉輪的水力性能優化 ,「r44opv」   中藍水處理成套設備(南京)有限公司,攪拌器,產品齊全,質量可靠,廣泛應用,歡迎來電諮詢選購!    攪拌器否則應立即切斷電源並進行調整:作為機械設備的一種潛水推流器本身較為耐用不需要非常特殊的環境但也需要一定的條件才能發揮出良好的性能。
  • 伺服性能優化神器 —— 波特圖
    共振點為如何通過系統調優來優化系統提供了線索。圖5:並聯諧振和共振頻率之間相差越大,慣性不匹配就越高首個並聯諧振節點的頻率越高,機構的剛度就越高。其中,K 為系統剛度,JM 為電機慣量,JL 為負載慣量調優計劃前面幾點提供了為優化性能進行系統調優的關鍵信息。
  • 高密池攪拌機葉輪的水力性能優化
    高密池攪拌機葉輪的水力性能優化   中藍水處理成套設備(南京)有限公司,高密池攪拌機,產品齊全,質量可靠,廣泛應用,歡迎來電諮詢選購!作為機械設備的一種潛水推流器本身較為耐用不需要非常特殊的環境但也需要一定的條件才能發揮出良好的性能。此外一代整體葉輪通過計算流體力學軟體進行優化水力性能好葉片寬而薄重量輕能耗低效率高推力大可降低減速器的使用負荷運行平穩延長設備的使用壽命?絕緣測試儀用於定子絕緣電阻用伏兆歐表測試任相線和後尾箱線與地面的絕緣值不小於油和石油已經被注入改變油艙通風系統的工廠!
  • 優化SQL Server數據邏輯 提高查詢性能
    6.ORDER BY和GROPU BY  使用ORDER BY和GROUP BY短語,任何一種索引都有助於SELECT的性能提高。注意如果索引列裡面有NULL值,Optimizer將無法優化。  7.任何對列的操作都將導致表掃描,它包括資料庫函數、計算表達式等等,查詢時要儘可能將操作移至等號右邊。
  • 通過誤差向量分析優化接收機性能
    誤差向量分析是一種用幅度誤差和相位誤差定量表示發射機或接收機性能的方法。通過採用具有誤差向量分析功能的向量信號分析儀,工程師可以在線研究信號空間的幅度值和相位誤差,同時可以調整接收機鏈路參數。  為了調整接收機參數以獲得最佳性能,有必要將給定接收機與理想接收機作性能比較,比較的方法有多種。
  • 槳式攪拌機葉輪的水力性能優化
    槳式攪拌機葉輪的水力性能優化   中藍水處理成套設備(南京)有限公司,攪拌機,產品齊全,質量可靠,廣泛應用,歡迎來電諮詢選購!作為機械設備的一種潛水推流器本身較為耐用不需要非常特殊的環境但也需要一定的條件才能發揮出良好的性能。
  • 神奇的 SQL 之性能優化 →讓 SQL 飛起來
    寫在前面在像 Web 服務這樣需要快速響應的應用場景中,SQL 的性能直接決定了系統是否可以使用;特別在一些中小型應用中,SQL 性能更是決定服務能否快速響應的唯一標準嚴格地優化查詢性能時,必須要了解所使用資料庫的功能特點,此外,查詢速度慢並不只是因為 SQL 語句本身,還可能是因為內存分配不佳、文件結構不合理、刷髒頁等其他原因因此本文即將介紹的優化
  • 電動車的馬達性能測試系統的優化配置
    電動車的馬達性能測試系統的優化配置: 現今電動車生產廠家愈來愈多,而起動馬達則是影響電動車性能的一個重要部件.對起動馬達性能測試必不可少,現向大家介紹一套起動馬達性能測試系統的優化配置-50Nm磁粉測功機自動測試系統.
  • 影響透氣磚使用性能的因素分析及優化措施
    1、鋼包透氣磚的使用現狀整體彌散式透氣磚自2015年投入使用以來,使用情況整體良好,但偶爾發生質量波動,在使用過程中,鋼包透氣磚吹掃後在進行精煉處理過程中出現透氣量小,鋼包下線後重新吹掃後效果不理想,彌散塊表面滲鋼,同時透氣磚磚芯殘磚不足,磚芯抗侵蝕性能差,造成使用後期透氣磚安全性能不理想。
  • 特效優化2:效果與性能的博弈
    我們將力圖以淺顯易懂的表達,讓職場萌新或優化萌新能夠深入理解。  1、特效運行時包含的  ParticleSystem組件數量過多  所以我們需要科學地做減法,減少ParticleSystem組件數量,以降低部分特效效果的代價來達到和項目性能之間的平衡。  這裡需要說明的是,規則給出的默認閾值是一個比較嚴苛的標準,研發團隊可以根據自己項目的實際需求去設定符合現階段性能承受範圍的閾值。  2、播放特效時最大粒子數量過多
  • 襯膠防腐攪拌器葉輪的水力性能優化
    襯膠防腐攪拌器葉輪的水力性能優化   中藍水處理成套設備(南京)有限公司,攪拌器,產品齊全,質量可靠,廣泛應用,歡迎來電諮詢選購!    攪拌器本發明結構緊湊操作維護簡單安裝維護方便使用壽命長、作為機械設備的一種潛水推流器本身較為耐用不需要非常特殊的環境但也需要一定的條件才能發揮出良好的性能。
  • 搪玻璃非標攪拌器葉輪的水力性能優化
    搪玻璃非標攪拌器葉輪的水力性能優化 ,「r44opv」   中藍水處理成套設備(南京)有限公司,攪拌器,產品齊全,質量可靠,廣泛應用,歡迎來電諮詢選購!    攪拌器型號安裝系統三主要由鏈塊提升架吊架座提升環鏈上支撐架導杆中間支撐架池深不含限位框底座等、作為機械設備的一種潛水推流器本身較為耐用不需要非常特殊的環境但也需要一定的條件才能發揮出良好的性能。
  • Unity高級知識點總結:性能優化與圖形渲染進階
    A.性能優化相關知識一、綜合優化1、降低屏幕解析度尤其是在android平臺對性能提升很大。可以有效緩解gpu的壓力。
  • 搪玻璃錨式攪拌器葉輪的水力性能優化
    搪玻璃錨式攪拌器葉輪的水力性能優化   中藍水處理成套設備(南京)有限公司,攪拌器,產品齊全,質量可靠,廣泛應用,歡迎來電諮詢選購!    攪拌器水處理潛水攪拌機有什麼樣的動力水處理潛水攪拌機有什麼樣的動力為世界做出大貢獻的潛水攪拌機製造商南京格柵除機工作原理機械格柵固液篩分生活水屠宰廢水格柵除機工作原理機械格柵固液篩分生活水屠宰廢水旋轉耙格柵除機工作原理旋轉格柵除機主要由機架齒耙和柵條耙板提升鏈條電機減速器等組成,作為機械設備的一種潛水推流器本身較為耐用不需要非常特殊的環境但也需要一定的條件才能發揮出良好的性能
  • 性能優於 MySQL 6 倍?阿里雲 PolarDB 的底氣在哪?
    PolarDB 的設計思想有幾點革新突破。另外在 DB Server 設計上,採用 MySQL 完全兼容的思路,完全擁抱開源生態,從 SQL 的編譯、性能優化器和執行計劃等等都保留了傳統關係型資料庫的特色。並且針對 Redolog 的 I/O 路徑,專門設計了多副本共享存儲塊設備。