不同的使用方式和組織方式,不僅決定了框架內(nèi)部特質(zhì)上的差異,還影響了外部使用上的區(qū)別。本文章主要介紹PhalApi v2.0.0 版本與PhalApi v1.4.1 版本之間的內(nèi)部差異。并約定,下文中,新版本是指PhalApi v2.0.0 版本,舊版本是指PhalApi v1.4.1 版本。
新、舊版本主要的對(duì)比結(jié)論,匯總?cè)缦拢?
壓測(cè)環(huán)境配置為:
待壓測(cè)的接口服務(wù)鏈接:
這里,使用Autobench進(jìn)行基準(zhǔn)測(cè)試,壓測(cè)腳本為:
autobench \
--single_host \
--host1=$DM \
--port1=80 \
--uri1=$URL \
--low_rate=1 \
--high_rate=50 \
--rate_step=1 \
--num_call=1 \
--num_conn=50 \
--timeout=5 \
--file ./$DM.tsv
對(duì)于新、舊版本,其壓測(cè)結(jié)果對(duì)比如下(左圖為新版,右圖為舊版):
在并發(fā)量為50以內(nèi)時(shí),新、舊版本的響應(yīng)時(shí)間基本一致,約為20 ms。對(duì)于新版,詳細(xì)的壓測(cè)報(bào)告數(shù)據(jù)如下:
dem_req_rate req_rate_demo2.phalapi.net con_rate_demo2.phalapi.net min_rep_rate_demo2.phalapi.net avg_rep_rate_demo2.phalapi.net max_rep_rate_demo2.phalapi.net stddev_rep_rate_demo2.phalapi.net resp_time_demo2.phalapi.net net_io_demo2.phalapi.net errors_demo2.phalapi.net
1 1.0 1.0 1.0 1.0 1.0 0.0 20.2 0.4 0
2 2.0 2.0 2.0 2.0 2.0 0.0 18.7 0.9 0
3 3.1 3.1 3.0 3.0 3.0 0.0 18.9 1.3 0
4 4.1 4.1 4.0 4.0 4.0 0.0 19.2 1.7 0
5 5.1 5.1 5.0 5.0 5.0 0.0 18.7 2.1 0
6 6.1 6.1 6.0 6.0 6.0 0.0 18.4 2.6 0
7 7.1 7.1 7.0 7.0 7.0 0.0 18.4 3.0 0
8 8.1 8.1 8.0 8.0 8.0 0.0 18.7 3.4 0
9 9.1 9.1 9.0 9.0 9.0 0.0 18.9 3.8 0
10 10.1 10.1 0.0 0.0 0.0 0.0 18.5 4.3 0
11 11.1 11.1 0.0 0.0 0.0 0.0 19.0 4.7 0
12 12.2 12.2 0.0 0.0 0.0 0.0 18.9 5.1 0
13 13.2 13.2 0.0 0.0 0.0 0.0 18.9 5.5 0
14 14.2 14.2 0.0 0.0 0.0 0.0 18.5 6.0 0
15 15.2 15.2 0.0 0.0 0.0 0.0 18.4 6.4 0
16 16.2 16.2 0.0 0.0 0.0 0.0 19.0 6.8 0
17 17.2 17.2 0.0 0.0 0.0 0.0 18.8 7.2 0
18 18.2 18.2 0.0 0.0 0.0 0.0 18.5 7.6 0
19 19.2 19.2 0.0 0.0 0.0 0.0 18.4 8.1 0
20 20.2 20.2 0.0 0.0 0.0 0.0 35.9 8.5 0
21 21.2 21.2 0.0 0.0 0.0 0.0 18.3 8.9 0
22 22.2 22.2 0.0 0.0 0.0 0.0 19.0 9.3 0
23 23.2 23.2 0.0 0.0 0.0 0.0 18.8 9.7 0
24 24.1 24.1 0.0 0.0 0.0 0.0 18.4 10.2 0
25 25.1 25.1 0.0 0.0 0.0 0.0 18.3 10.6 0
26 26.1 26.1 0.0 0.0 0.0 0.0 18.4 11.0 0
27 27.1 27.1 0.0 0.0 0.0 0.0 18.5 11.4 0
28 28.1 28.1 0.0 0.0 0.0 0.0 18.5 11.8 0
29 29.1 29.1 0.0 0.0 0.0 0.0 18.4 12.3 0
30 30.1 30.1 0.0 0.0 0.0 0.0 18.5 12.7 0
31 31.1 31.1 0.0 0.0 0.0 0.0 18.7 13.1 0
32 32.0 32.0 0.0 0.0 0.0 0.0 18.3 13.5 0
33 33.0 33.0 0.0 0.0 0.0 0.0 18.3 13.9 0
34 34.0 34.0 0.0 0.0 0.0 0.0 18.1 14.3 0
35 10.5 10.5 0.0 0.0 0.0 0.0 48.5 4.4 0
36 8.1 8.3 9.8 9.8 9.8 0.0 18.3 3.4 2.04081632653061
37 37.0 37.0 0.0 0.0 0.0 0.0 18.2 15.6 0
38 37.9 37.9 0.0 0.0 0.0 0.0 18.4 15.9 0
39 38.9 38.9 0.0 0.0 0.0 0.0 18.6 16.4 0
40 39.9 39.9 0.0 0.0 0.0 0.0 18.6 16.8 0
41 40.9 40.9 0.0 0.0 0.0 0.0 18.6 17.2 0
42 41.8 41.8 0.0 0.0 0.0 0.0 18.4 17.6 0
43 8.0 8.2 9.8 9.8 9.8 0.0 18.6 3.4 2.04081632653061
44 12.4 12.4 0.0 0.0 0.0 0.0 18.4 5.2 0
45 25.2 25.2 0.0 0.0 0.0 0.0 18.2 10.6 0
46 12.5 12.5 0.0 0.0 0.0 0.0 18.5 5.3 0
47 25.2 25.2 0.0 0.0 0.0 0.0 18.3 10.6 0
48 12.5 12.5 0.0 0.0 0.0 0.0 18.4 5.2 0
49 25.2 25.2 0.0 0.0 0.0 0.0 18.6 10.6 0
50 9.3 9.3 9.8 9.8 9.8 0.0 35.7 3.9 0
使用XHprof對(duì)新、舊版本進(jìn)行性能剖析,經(jīng)過(guò)多次分析并取各自最優(yōu)值,對(duì)關(guān)鍵性能指標(biāo)的對(duì)比如下:
性能指標(biāo) | PhalApi v2.0.0 新版本 | PhalApi v1.4.1 舊版本 | 趨勢(shì) |
---|---|---|---|
Total Incl. Wall Time (microsec) | 9,249 microsecs | 8,393 microsecs | + 10.20% |
Total Incl. CPU (microsecs) | 8,999 microsecs | 6,999 microsecs | + 28.58% |
Total Incl. MemUse (bytes) | 1,852,424 bytes | 1,608,600 bytes | + 15.16% |
Total Incl. PeakMemUse (bytes) | 1,866,608 bytes | 1,619,544 bytes | - 10.27% |
Number of Function Calls | 629 | 701 | + 13.69% |
就上面報(bào)告的數(shù)據(jù)可以看出,新版本的各項(xiàng)性能指標(biāo)比舊版本有所增加。這是因?yàn)橐肓薱omposer機(jī)制所產(chǎn)生的影響。雖然有所漲幅,但由于基數(shù)低,新版本的性能還是非常優(yōu)異的。例如對(duì)于Wall Time,新版本為9,249毫秒,舊版本的Wall Time為8,393 microsecs,僅相差了0.856毫秒,即不到1毫秒。執(zhí)行時(shí)間會(huì)隨系統(tǒng)環(huán)境配置不同,執(zhí)行時(shí)的系統(tǒng)狀態(tài)不同,會(huì)相對(duì)變化,而函數(shù)調(diào)用的次數(shù)則是固定的。如果僅從函數(shù)調(diào)用次數(shù)來(lái)對(duì)比,新版本則比舊版本少了72次調(diào)用。
新版本的XHprof性能報(bào)告概覽如下:
新版本的Top 10耗時(shí)操作是:
Function Name | Calls | Calls% | Excl. Wall Time (microsec) | EWall% |
---|---|---|---|---|
load::NotORM/Result.php | 1 | 0.20% | 1408 | 15.20% |
run_init::src/bootstrap.php | 1 | 0.20% | 2813 | 30.40% |
load::composer/ClassLoader.php | 1 | 0.20% | 449 | 4.90% |
load::Database/NotORMDatabase.php | 1 | 0.20% | 314 | 3.40% |
load::NotORM/MultiResult.php | 1 | 0.20% | 286 | 3.10% |
load::NotORM/Structure.php | 1 | 0.20% | 255 | 2.80% |
load::NotORM/Row.php | 1 | 0.20% | 252 | 2.70% |
load::src/Request.php | 1 | 0.20% | 243 | 2.60% |
load::NotORM/Cache.php | 1 | 0.20% | 213 | 2.30% |
PhalApi\Request::getAllHeaders | 1 | 0.20% | 229 | 2.50% |
對(duì)應(yīng)的高清版可視化圖表如下:
可以看到,最耗時(shí)的操作是對(duì)NotORM文件的引入(上圖經(jīng)色部分),這與舊版本最耗時(shí)的操作是一樣的。
更多請(qǐng)點(diǎn)擊查看:
PhalApi一直推薦使用測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)方式,通過(guò)意圖導(dǎo)向編程,提高開(kāi)發(fā)效率、提升代碼質(zhì)量。
對(duì)于PhalApi自身框架的開(kāi)發(fā),我們同樣也是遵循TDD的最佳實(shí)踐,爭(zhēng)取為開(kāi)源社區(qū)產(chǎn)出優(yōu)質(zhì)的框架。對(duì)于新版本,其核心框架代碼部分的單元測(cè)試覆蓋率達(dá)94%以上,如下圖所示:
此外,核心框架的單元測(cè)試通過(guò)率是100%。執(zhí)行單元測(cè)試套件的輸出效果,類似如下:
/path/to/phalapi/kernal/tests$ phpunit -c ./phpunit_silence.xml
PHPUnit 4.3.4 by Sebastian Bergmann.
Configuration read from /path/to/phalapi/kernal/tests/phpunit_silence.xml
............................................................... 63 / 327 ( 19%)
............................................................... 126 / 327 ( 38%)
............................................................... 189 / 327 ( 57%)
............................................................... 252 / 327 ( 77%)
............................................................... 315 / 327 ( 96%)
............
Time: 14.05 seconds, Memory: 26.25Mb
OK (327 tests, 480 assertions)
借助于開(kāi)源中國(guó)碼云上的代碼分析服務(wù),可以得到以下Sonar分析報(bào)告,從中可以看到新版框架的核心部分技術(shù)債務(wù)僅有1天。
快速對(duì)比新、舊版的靜態(tài)代碼質(zhì)量,可以得出:新版本在遵循composer和psr-4規(guī)范下,代碼質(zhì)量更優(yōu)。例如,技術(shù)債務(wù)從原來(lái)1天5小時(shí)降為1天,問(wèn)題總數(shù)從158個(gè)降為97個(gè)。
質(zhì)量指標(biāo)|PhalApi v2.0.0 新版本|PhalApi v1.4.1 舊版本|趨勢(shì)
代碼行數(shù)|2663|2267| + 17.46%
技術(shù)債務(wù)|1天|1天 5小時(shí)| - 17.24%
問(wèn)題總數(shù)|97|158| - 38.61%
復(fù)雜度(方法)|2.7|2.7| 0%
更多請(qǐng)點(diǎn)擊查看:
更多建議: