# PhalApi 2.x VS PhalApi 1.x
不同的使用方式和组织方式,不仅决定了框架内部特质上的差异,还影响了外部使用上的区别。本文章主要介绍**PhalApi v2.0.0 版本**与**PhalApi v1.4.1 版本**之间的内部差异。并约定,下文中,**新版本**是指PhalApi v2.0.0 版本,**旧版本**是指PhalApi v1.4.1 版本。
新、旧版本主要的对比结论,汇总如下:
+ 新、旧版基准测试结果基本一致
+ 新、旧版本执行时间相差约为1毫秒
+ 新版的单元测试,覆盖率达90%以上,通过率为100%
+ 新版的技术债务仅1天,质量更优!
## 基准测试对比
### 对比结论:新、旧版基准测试结果基本一致
压测环境配置为:
+ 阿里云服务器ECS(CPU:1核 内存:1 GB 宽带:1Mbps)
+ 操作系统:CentOS release 6.7 (Final)
+ nginx/1.8.0
+ PHP 5.3.5
待压测的接口服务链接:
+ PhalApi v2.0.0 默认接口服务:http://demo2.phalapi.net/
+ PhalApi v1.4.1 默认接口服务:http://demo.phalapi.net/
这里,使用Autobench进行基准测试,压测脚本为:
```
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
```
对于新、旧版本,其压测结果对比如下(左图为新版,右图为旧版):
![](http://7xiz2f.com1.z0.glb.clouddn.com/20170709150238_613518e69d081355beb9ff56034a3aa0)
在并发量为50以内时,新、旧版本的响应时间基本一致,约为20 ms。对于新版,详细的压测报告数据如下:
```
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性能剖析对比
### 对比结论:新、旧版本执行时间相差约为1毫秒
使用XHprof对新、旧版本进行性能剖析,经过多次分析并取各自最优值,对关键性能指标的对比如下:
性能指标|PhalApi v2.0.0 新版本|PhalApi v1.4.1 旧版本|趋势
---|---|---|---
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%
就上面报告的数据可以看出,新版本的各项性能指标比旧版本有所增加。这是因为引入了composer机制所产生的影响。虽然有所涨幅,但由于基数低,新版本的性能还是非常优异的。例如对于Wall Time,新版本为9,249毫秒,旧版本的Wall Time为8,393 microsecs,仅**相差了0.856毫秒**,即不到1毫秒。执行时间会随系统环境配置不同,执行时的系统状态不同,会相对变化,而函数调用的次数则是固定的。如果仅从函数调用次数来对比,新版本则比旧版本少了72次调用。
### 新版本的XHprof报告
新版本的XHprof性能报告概览如下:
![](http://7xiz2f.com1.z0.glb.clouddn.com/20170716132036_d131915bf18df8954d918d8f4ff71ad5)
新版本的Top 10耗时操作是:
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%
对应的高清版可视化图表如下:
![](http://7xiz2f.com1.z0.glb.clouddn.com/20170716132700_9442f75871e38a59c5bcedcccdda6903)
可以看到,最耗时的操作是对NotORM文件的引入(上图经色部分),这与旧版本最耗时的操作是一样的。
更多请点击查看:
+ [新版本的XHprof报告 - 20170716](https://www.phalapi.net/xhprof/xhprof_html/?run=596af62c31dac&source=xhprof_foo&sort=excl_wt)
+ [旧版本的XHprof报告 - 20170709](https://www.phalapi.net/xhprof/xhprof_html/index.php?run=5961c4ca5b9a6&source=xhprof_foo)
## 单元测试覆盖率对比
### 对比结论:新版依然保持着90%以上的单元测试覆盖率
PhalApi一直推荐使用测试驱动的开发方式,通过意图导向编程,提高开发效率、提升代码质量。
对于PhalApi自身框架的开发,我们同样也是遵循TDD的最佳实践,争取为开源社区产出优质的框架。对于新版本,其核心框架代码部分的单元测试覆盖率达94%以上,如下图所示:
![](http://7xiz2f.com1.z0.glb.clouddn.com/20170709140256_205e5ac4b9730daec4188f51aaccc8c1)
此外,核心框架的单元测试通过率是100%。执行单元测试套件的输出效果,类似如下:
```bash
/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)
```
## 静态代码质量分析对比
### 对比结论:新版的技术债务仅1天,质量更优!
借助于开源中国码云上的代码分析服务,可以得到以下Sonar分析报告,从中可以看到新版框架的核心部分技术债务**仅有1天**。
![](http://7xiz2f.com1.z0.glb.clouddn.com/20170709151921_9ce43b2fa34077ede6816530d06b451a)
快速对比新、旧版的静态代码质量,可以得出:新版本在遵循composer和psr-4规范下,代码质量更优。例如,技术债务从原来1天5小时降为1天,问题总数从158个降为97个。
质量指标|PhalApi v2.0.0 新版本|PhalApi v1.4.1 旧版本|趋势
代码行数|2663|2267| + 17.46%
技术债务|1天|1天 5小时| - 17.24%
问题总数|97|158| - 38.61%
复杂度(方法)|2.7|2.7| 0%
更多请点击查看:
+ [PhalApi v2.0.0 新版本Sonar分析报告](http://git.oschina.net/dogstar/kernal/quality_analyses?platform=sonar)
+ [PhalApi v1.4.1 旧版本Sonar分析报告](http://git.oschina.net/dogstar/PhalApi/quality_analyses?platform=sonar)