博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
20:1, PHP性能评测Base62x:内置模块 vs. 脚本模块
阅读量:7032 次
发布时间:2019-06-28

本文共 2416 字,大约阅读时间需要 8 分钟。

hot3.png

上篇( )我们概括地解释了使用服务器端、客户端各种缓存、压缩优化提速-gMIS等手段. 这次更具体到编程语言层面讨论优化。行文此前背景:

1.  -gwa2 vs -thinkphp,  
2. php的所谓优化,  
3. 关于Log4j和Sysytem.out.println的性能比较测试, 

关于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扩展模块的详细操作参考, ,  .

分别使用上述方法进行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 左右。

16155523_olV5.png

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

 

转载于:https://my.oschina.net/wadelau/blog/880333

你可能感兴趣的文章
javascript继承方法以及优缺点
查看>>
tab 切换下划线跟随实现
查看>>
20+个很棒的Android开源项目
查看>>
跨域、vue双向绑定相关面试题
查看>>
Web Components(一)入门
查看>>
mpvue打包没有app.json等配置文件的解决方法
查看>>
树莓派配置swoole环境
查看>>
JavaScript 工作原理之十二-网络层探秘及如何提高其性能和安全性
查看>>
搭建基于react项目的心得
查看>>
react-native踩坑记录
查看>>
HTTP API 设计入坑指南(一)
查看>>
OkHttp源码分析
查看>>
【挖坑系列】跨域问题相关
查看>>
使用cronolog切割nginx访问日志,定时清理旧日志
查看>>
PHP最常用函数TOP100(翻译)
查看>>
大数据科学新发展展望:不得不知的四大趋势
查看>>
python多线程、锁、event事件机制的简单使用
查看>>
ES6系列之解构赋值
查看>>
goLang 文件操作之二
查看>>
7大维度看国外企业为啥选择gRPC打造高性能微服务?
查看>>