前言
PHP近来有了长远进步, 一方面,PHP7的发布让执行速度有了明显提高; 另一方面,随着swoole的逐渐稳定,必将会出现越来越多的基于PHP的常驻内存的服务化应用,大大降低了由于php请求不断销毁资源导致的性能损失(可围观我的基于swoole的fastcgi实现,优化laravel接口性能50+倍)。
数组,作为php最常用的数据结构,没有之一。尽管PHP7重新设计了数组的实现,大大提高了内存占用率和CPU缓存友好, PHP7速度的提升相当一部分也得益于此。 但是, 毕竟我们不能用一种数据结构优化所有场景。 随着PHP常驻内存程序的发展,未来可能出现一些对内存占用,对数据结构操作性能更敏感的项目。
比如我们在内存里保存一个大的数字序列, 或者一个布隆过滤器等等, 如果使用PHP数组会造成内存的浪费。幸运的是, 早有人发现这个问题, 我们可以很容易地为PHP7增添新的数据结构,甚至自己去实现需要的数据结构。
安装
# Dependencies you might need to install
# sudo add-apt-repository ppa:ondrej/php
# sudo apt-get update
# sudo apt-get install git build-essential php7.0-dev
git clone https://github.com/php-ds/extension "php-ds"
cd php-ds
# Build and install the extension
phpize
./configure
sudo make install
# Clean up the build files
make clean
phpize --clean
性能分析
作者写了一篇很好的文章, 用视频展现了数据结构操作是如何变化的, 并分析了各种操作的复杂度, 最后还列出了时间和空间曲线。感觉再说啥都是画蛇添足了:Efficient data structures for PHP 7
支持的数据结构有: Vector, Deque, Stack, Queue, PriorityQueue, Map, Set
结论
受限于zval的内存占用, 这些数据结构和C实现相比, 内存占用还是要高很多, 但是相对PHP数组来说已经有很大提高。 未来在实现功能时, 我们会多一种选择, 这总归是好事, 不是吗?