20:1, PHP性能评测Base62x:内置模块 vs. 脚本模块

上篇( -R/P2SN )我们概括地解释了使用服务器端、客户端各种缓存、压缩优化提速-gMIS等手段. 这次更具体到编程语言层面讨论优化。行文此前背景:
1.  -gwa2 vs -thinkphp, -R/92SJ
2. php的所谓优化, -R/22SK
3. 关于Log4j和Sysytem.out.println的性能比较测试, -R/I2SL

关于Java/PHP的性能评测和优化,大致结论是面向对象编程(OOP)等是拿性能换便利(Convenience)、强壮(Robustness)等,除了描绘客观复杂世界所需外,深层的另因可能是硬件性能越来便宜,而人工越来昂贵。本文可以看作是其中 2. 的接续,尝试探索的是,在PHP编程中,使用C语言等实现的Module/模块(内置模块)比PHP脚本写的Module/模块(脚本模块)快吗? 如果快,同样的功能,能快多少?

距离上次进行类似的测试,已经十多年过去了,PHP和Java都发展了很多版本,日益成熟和稳定,而C语言却保持了相对的稳定,现在重新做一些这样的性能对比,颇有时空感。

要做这样的实验而且有一定实际意义的话,机会要等或者碰的,此前进行的将 -Base62x 进行多版本语言开发工作,刚好能满足这一实验的目的。我们成功将地C语言的 -Base62x 编译成PHP 7 的一个ext模块 ext/base62x ,同时也使用PHP脚本语言实现了 -Base62x 的版本,名为 base62x.class.php, 相应地代码都可以从 -github-wadelau 下载获得。

有了这些准备工作,我们要进行的实验是使用同样的算法,对一段文本进行 -Base62x 编码,C语言实现的PHP ext/base62x 模块会比使用PHP脚本编写的 base62x.class.php 运行得快吗? 能快多少?

基于此,我们编写了测试程序,进行一万次随机字符串的 base62x 编码,将其运行耗费时间进行记录对比。

测试程序主体, basetest.php
使用base62x.class.php的编码方法, 
      $b62x = new Base62x();
      $s_encoded = $b62x->encode($s);
使用PHP内置C语言实现的同样算法模块base62x.c的编码方法,
      $s_encoded = base62x_encode($s);

使用C语言的模块需要重新编译PHP的安装目录对应的程序,关于编制PHP扩展模块的详细操作参考,-R/d2SH , -R/M2SJ .

分别使用上述方法进行10,000次编码,使用PHP的内置函数microtime进行计时,记录每进行10,000次编码操作时,两者所花费的时间,重复进行10次,记录列如下。

base62x.class vs. base62x.c for 10K strings encoded operations

  Time cost for Time cost for  
  base62x.class.php base62x.c  
1 0.15378499 0.006615877  
2 0.154273987 0.006779909  
3 0.161313057 0.00666213  
4 0.178726912 0.00667119  
5 0.193426132 0.007475138  
6 0.162053108 0.00752902  
7 0.169737101 0.00692296  
8 0.155719995 0.006750107  
9 0.164766073 0.007402897  
10 0.196639061 0.006860018  
      Faster x
avg 0.169044042 0.006966925 24.2637964
max 0.196639061 0.00752902 26.11748314
min 0.15378499 0.006615877 23.24483765

测试主机环境为普通台式机PC上运行的VMWare Station中运行的OpenSuSE Linux Leap 64bit,PHP 7.0.

运行数据显示,使用PHP脚本语言实现的base62x.class进行一万次编码平均需要花费0.1690秒,也即需要169.0ms;而使用C语言实现的同样的算法的base62x算法的一万次编码平均需要花费的时间为0.0070秒,也即7.0ms;两相比较,前者是后者的24倍,也即base62x.class比base62x.c多用了20多倍的时间,后者比前者快了20多倍。

进一步地拉长与之前的对比,PHP的优化思路,优化逻辑,减少不必要的操作步骤,减少自定义的方法、类库,尽量使用内置方法、类库,当这些还不足够快时,终极提速或者能有较大提速的就是使用类似C语言以PHP扩展模块的方式进行尝试。

针对这个终极优化思路,之前只是定性的分析,这次有了定量的分析,印证了之前的分析和推测。

结合之前提到的针对 Java 的 Log4j 和 System.out.println 对比,似乎这种终极优化也可以应用到 Java 的编程中,通过使用JNI调用Java对外部C/C++等实现的扩展,也能否取得20:1点提速效果,这还有待进一步地实验。

经次实验可以大致地得出,同样算法,使用C语言实现的PHP扩展的内置模块比使用PHP脚本编写的OOP模块要快很多,其比值大约在 20:1 左右。

Base62x: An Alternative Approach to Base64 for non-Alphanumeric Characters.
Base62x 是无符号的Base64编码方案。在文件系统、网络系统中可以安全地使用,同时是各种变种Base64编码方案的理想替代品。

This entry was posted in Base62x, 编程技术, 计算机技术 and tagged , , , . Bookmark the permalink.

发表评论

电子邮件地址不会被公开。 必填项已用*标注