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 于 1周前 加精
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 5

可以,很强

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

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

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

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