PHP 中一次反射需要多长时间

我们经常说,对于一个 IO 密集型的应用过来说,语言不是性能的瓶颈,IO 的操作才是性能的瓶颈。我们常常看的也是一个接口请求需要多长时间、一次数据库查询需要多少时间,我们很少去测试一行代码、一个方法调用、一次实例化需要多长时间。

因为我们的项目中,我们大规模的使用了反射 API,我就好奇在 PHP 中一次反射需要多长时间。于是,我们来写代码来测试一下:

class Test {}

$startTime = microtime(true);
new ReflectionClass(Test::class);
$endTime = microtime(true);

var_dump(($endTime - $startTime) * 1000);

这不是一次很严谨的基准测试,所以我就不执行一万、百万次了,就执行一次。结果是 0.0040531158447265625 毫秒。是不是非常快,那么是不是说我们在项目中可以随意使用反射 API 了呢?反正,相比一次数据库查询动辄几十几百甚至几秒来说,这简直不值一提。

我们再来看下面这段代码的测试:

include 'vendor/autoload.php';

$startTime = microtime(true);
new ReflectionClass(Bean::class);
$endTime = microtime(true);

var_dump(($endTime - $startTime) * 1000);

你猜同样是构建 ReflectionClass ,区别只是我加入了 Composer 的 Autoload 机制而已。打印的结果竟然是: 0.9691715240478516, 将近 1 毫秒,天啊!这是为什么呢?因为 PHP 的自动加载机制,在每实例化一个类的时候都会触发文件系统中去根据路径查找文件,也就是说可能会有一次 IO 操作。所以,本质上,这不是反射 API 慢,而是自动加载机制慢,是 IO 操作慢,不信你可以把代码换一下,输出的结果也是类似的:

include 'vendor/autoload.php';

$startTime = microtime(true);
(new Bean);
$endTime = microtime(true);
var_dump(($endTime - $startTime) * 1000);

所以,在进行 PHP 项目部署的时候要做好优化工作,不然你的接口从语言层面来说就会慢几十毫秒…… 下面是一些基础的优化:

composer dump-autoload --optimize
composer install --no-dev --prefer-dist --prefer-stable

# Laravel 项目
php artisan optimize
本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 MArtian 于 2周前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 7

可以,很强

2周前 评论
苏近之 (楼主) 2周前

测试的是一个空对象,速度算慢了

1周前 评论
苏近之 (楼主) 5天前

不严谨, 不用单例的话, 类似依赖注入, 万一每调用一次就反射一次, 单次耗时低但架不住次数多 .

18小时前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!