摘要:路由控制器性能測試前言前段時間抽空寫了個微型路由控制器可以在我的另一篇文章里面看到詳細的介紹。上門有測試以及這幾個路由控制器的性能,總體來說和在最壞的情況下表現最好。同樣的測試條件。所以本次測試僅僅針對,以及。
PHP路由控制器性能測試 前言
前段時間抽空寫了個微型路由控制器可以在我的另一篇文章里面看到詳細的介紹。雖然在設計的時候及盡量避開了正則匹配和數組循環這種耗時的操作。盡量節省時間。但是那都是理論上的。今天就實際測試了一下。
代碼github上面專門有一個叫做php-router-benchmark的倉庫,用來測試路由分發的性能。
上門有測試php-r3,Pux,FastRoute,Symfony2 Dumped,Symfony2 以及Aura v2這幾個路由控制器的性能,總體來說R3和FastRoute在最壞的情況下表現最好。其中R3和Pux是C語言實現的插件,有語言上面的性能優勢。
測試首先fork了一份這個benchmark的庫,并把自己的Router的測試代碼加上去了。同樣的測試條件。由于R3沒有裝上,還有Pux安裝失敗。所以本次測試僅僅針對FastRoute,Symfony2 Dumped,Symfony2,Aura v2以及Router。
這樣也好,反正這幾個都是純PHP實現的。另外兩個C語言實現的這次就不進行比較了。
首先是最壞情況下的測試,其中包含了兩個測試用例,一個是找不到的404 還有一個是在列表最后一個才能匹配到的,也就是最壞的兩種情況。
Worst-case matchingThis benchmark matches the last route and unknown route. It generates a randomly prefixed and suffixed route in an attempt to thwart any optimization. 1,000 routes each with 9 arguments.
This benchmark consists of 10 tests. Each test is executed 1,000 times, the results pruned, and then averaged. Values that fall outside of 3 standard deviations of the mean are discarded.
Test Name | Results | Time | + Interval | Change |
---|---|---|---|---|
Router - unknown route (1000 routes) | 993 | 0.0000232719 | +0.0000000000 | baseline |
Router - last route (1000 routes) | 981 | 0.0000955424 | +0.0000722705 | 311% slower |
FastRoute - unknown route (1000 routes) | 990 | 0.0005051955 | +0.0004819236 | 2071% slower |
FastRoute - last route (1000 routes) | 998 | 0.0005567203 | +0.0005334484 | 2292% slower |
Symfony2 Dumped - unknown route (1000 routes) | 998 | 0.0006116139 | +0.0005883420 | 2528% slower |
Symfony2 Dumped - last route (1000 routes) | 998 | 0.0007765370 | +0.0007532651 | 3237% slower |
Symfony2 - unknown route (1000 routes) | 996 | 0.0028456177 | +0.0028223458 | 12128% slower |
Symfony2 - last route (1000 routes) | 993 | 0.0030129542 | +0.0029896823 | 12847% slower |
Aura v2 - last route (1000 routes) | 989 | 0.1707107230 | +0.1706874511 | 733450% slower |
Aura v2 - unknown route (1000 routes) | 988 | 0.1798588730 | +0.1798356011 | 772760% slower |
查看上表的數據,我自己的Router在兩種測試用例的最壞情況下都是表現最好的。并且把其他幾個遠遠的甩出幾條街。看來這個主要得益于使用樹形結構的PHP數組來存儲路由表。所以進行遍歷的時候始終能達到O(log n)的時間復雜度。
然后再來看最好的情況,也就是在第一個url就能匹配到的情況。
First route matchingThis benchmark tests how quickly each router can match the first route. 1,000 routes each with 9 arguments.
This benchmark consists of 5 tests. Each test is executed 1,000 times, the results pruned, and then averaged. Values that fall outside of 3 standard deviations of the mean are discarded.
Test Name | Results | Time | + Interval | Change |
---|---|---|---|---|
FastRoute - first route | 998 | 0.0000498390 | +0.0000000000 | baseline |
Symfony2 Dumped - first route | 995 | 0.0000517531 | +0.0000019141 | 4% slower |
Router - first route | 994 | 0.0001499363 | +0.0001000972 | 201% slower |
Aura v2 - first route | 998 | 0.0008559464 | +0.0008061073 | 1617% slower |
Symfony2 - first route | 998 | 0.0012734995 | +0.0012236604 | 2455% slower |
查看這個表的數據,每一個庫只有一個測試用例。是測試的“最好”的情況。這里之所以加上引號是因為,Router使用的是樹形結構存儲,其他幾個庫所謂的“最好”情況,其實不適用了。不能在第一個匹配到。所以應該說在這個測試用例中Router還是以比較平均的時間來和其他幾個庫的最好時間進行比較!!!(比較一下上下兩個表中的Time絕對值就能看出,其他幾個庫在下面的“最好”情況下都比上面的最壞情況要好很多,但是Router庫的表現確是相反的,并且不管那種情況時間都是比較接近的,這就和之前提到的樹形節點遍歷的時間復雜度相對固定有關系)
后記這次測試了幾個純PHP實現的路由控制器,等下次繼續把兩個C語言實現的庫一起拿來比較一下!!!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/21167.html
摘要:為了一探究竟,于是開啟了這次應用性能調優之旅。使用即時編譯器和都能輕輕松松的讓你的應用程序在不用做任何修改的情況下,直接提高或者更高的性能。 這是一份事后的總結。在經歷了調優過程踩的很多坑之后,我們最終完善并實施了初步的性能測試方案,通過真實的測試數據歸納出了 Laravel 開發過程中的一些實踐技巧。 0x00 源起 最近有同事反饋 Laravel 寫的應用程序響應有點慢、20幾個并...
摘要:目前的業務訪問量數千萬,后端臺,平均使用率。產生的問題長連接數超過時,性能會下降。很可惜,我們目前使用的青云,目前尚不能實現超高可用,也不能實現無縫擴容,私網內的網絡傳輸性能延遲都有很大優化空間。經測試,性能有的提升。 需求分析 目前的業務全站使用ThinkPHP 3.2.3,前臺、后臺、Cli、Api等。目前的業務API訪問量數千萬,后端7臺PHP 5.6,平均CPU使用率20%。 ...
摘要:一是什么全稱用語言編寫的輕量級擴展框架專注于開發。這里只是給出了一種測試方法通過多次不同并發數測試結果得知與原生性能消耗是。業務開發速度結論采用框架開發業務代碼量能節約。 showImg(https://segmentfault.com/img/bVbamHp?w=320&h=320); 一、Asf 是什么? 全稱 API Services Framework, 用C語言編寫的輕量級P...
摘要:一路由目錄眾所周知,對于我們熟知的任何一款框架,例如路由系統都是極其重要的存在。文件用于定義界面的路由。定義在中的路由都是無狀態的,并且被分配了中間件組。生成的控制器為每個行為保留了方法,同時還包括了處理動作和的聲明注釋。 一、路由目錄 眾所周知,對于我們熟知的任何一款PHP框架,例如TP、CI、YII、路由系統都是極其重要的存在。 對于laravel框架也一樣,對于數據庫的操作,無非...
閱讀 3030·2021-11-24 09:39
閱讀 2266·2021-10-08 10:05
閱讀 2753·2021-09-24 13:52
閱讀 1572·2021-09-22 15:07
閱讀 593·2019-08-30 15:55
閱讀 1812·2019-08-30 15:53
閱讀 691·2019-08-30 15:44
閱讀 3121·2019-08-30 11:20