PHP依赖注入容器性能基准测试
钥匙要点
- 依赖性注入容器(DIC)是在较大的PHP应用程序和框架中维护代码库的关键工具,但会影响性能。 PHP的一些众所周知的DIC包括PHP-DI,SymfonyDepentientiention,Zenddi,Ornodi,Dice和aura.di. > DIC的性能是根据执行时间,内存使用和所包括的文件数来衡量的。最后一个指标尤其重要,因为它会极大地影响应用程序的整体重量。 在经过测试的容器,骰子,Aura和Orno中,
- 最快,骰子是最快的。尽管具有独特的功能,但PHP-DI的性能很大。 Symfony虽然更难配置,但在中间立场上执行,对于那些寻求著名项目容器的人来说,这将是首选的选择。 尽管性能差异,但DIC的选择也应考虑配置语法和功能。对于任何实际应用,骰子,Aura和Orno之间的性能差异都可以忽略不计,因此,开发人员应根据他们希望使用的。
- 大多数框架和较大的PHP应用程序都采用依赖式注入容器,其目标是更可维护的代码库。但是,这可能会影响性能。由于加载时间很重要,因此快速保持站点一如既往的重要性。今天,我将基准基准几个PHP依赖注入容器,以了解其相对性能。 对于那些不熟悉概念的人,依赖性注入容器是一种自动构建对象树的软件。例如,考虑一个需要数据库实例的用户对象。
>每次称呼,都会使用“注入”数据库对象创建一个用户对象。
-
PHP-DI,一个流行的DI容器
- symfonyDipendentibextifement,Symfony框架提供的依赖性注入容器
- > zenddi Zend Framework提供的依赖式注入容器
- ornodi,一个鲜为人知的容器,具有有限的功能,但刻意
- 的性能开发 骰子,另一个鲜为人知的容器,重点是轻量级。全面披露,我是这个容器的作者,但在此分析中我将完全客观。
- > pimple上的单词:虽然丘疹被广告为依赖性注入容器,但是从容器中检索对象总是返回相同的实例,这使得pimple成为服务定位器,而不是依赖性注入容器,因此,无法被测试。
>尽管所有容器都支持不同的功能,但该基准测试将涵盖依赖项注入容器所需的基本功能。也就是说,创建对象并注入需要的依赖性。
将测量依赖注入的哪些方面?执行时间
>内存使用
- >包括的文件数量。尽管这对性能几乎没有影响,但可以很好地指示图书馆的轻量级和便携式。如果您由于选择DI而必须用项目运送数百个文件,则可能会严重影响您自己应用程序的整体重量。
- 测试环境
- 所有测试均在运行Arch Linux(3.15内核),PHP 5.5.13和每个容器的最新版本的同一台机器上运行,截至03/07/2014。
测试1 - 创建一个对象的实例
>此测试使用每个容器创建一个简单的对象10,000倍
没有依赖注入容器,这将写为:
如您所见,这里有两个清晰的营地。 Aura,Dice和Orno的速度大约比PHP-DI,Symfony和Zenddi快十倍。
<span>$user = new User(new Database());</span>
>这是每个容器的轻量级,并且在解释内存使用差异方面有些轻巧。应该注意的是,Zenddi使用的许多文件都是常见的框架文件,因此,如果您使用Zend Framework,那么使用Zenddi不会在您的应用程序中其他位置重复使用Zenddi,而不会将相同的内存开销。
> 同样,php-di在很大程度上依赖于学说库。如果您在项目中使用学说,则减少了PHP-DI的内存开销。>但是,很高兴看到SymfonyDepentIndientientient是框架堆栈的一部分,这是完全独立的,并且没有其他Symfony Projects。
由于加载文件会影响性能,Zend和PHP-DI都加载了大量文件,因此通过首先创建类的单个实例来进行相同的测试,忽略了自动加成时间,以确保在测量之前自动加载任何必需的类时间。
>
这也可能触发了容器所做的任何内部缓存,但是对每个容器都采用了相同的处理,以使其保持公平
等效的php代码:
>测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi
<span>$user = new User(new Database());</span>
如预期的那样,由于没有测量自动加载时间,记忆使用情况不变,性能稍好一些。但是,这表明php-di,即使加载42个文件也对总执行时间有忽略不计,相对性能保持不变,加载数十个文件并不是PHP-DI和Zenddi的原因相对较慢。 即使忽略了加载文件的开销,这里仍然有两个不同的球场。 Aura,Dice和Orno在性能和内存使用方面非常相似,而PHP-DI,Zend和Symfony仅在彼此之间竞争。
>未来的所有测试都会忽略自动加载的时间,以确保真正是容器的性能。>
测试3 - 深对象图
通过让容器构造这组对象10,000次来完成此测试:
>测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi
注意:您可以通过查看测试代码,Symfony,PHP-DI和AURA所看到的,与其他容器相比,需要更大的配置代码才能执行此测试。配置时间不包括在测试中。
再次,前三名之间的区别很小,骰子比光环快20%,比Orno快70%。这三个都比Zend,PHP-DI和Symfony快得多。三个顶部容器之间的差异是如此微小,以至于您永远不会注意到像这样的人造基准之外的速度差异。
zend,php-di,在较小程度上,同伴在这里很慢。 Zend需要37秒才能在1秒内执行任务骰子管理;当然不是微不足道的差异。同样,Symfony在大名容器中带头。
内存和文件计数与我们在其他测试中看到的内容一致。
>测试4 - 从容器中获取服务
di容器还必须存储和检索将在整个应用程序中重复使用的服务。该测试可反复从容器中获取一个实例。
纯PHP等效:
<span>$user = new User(new Database());</span>
>测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi
这是根据先前的结果出乎意料的。除Zend和Symfony以外的所有容器大致相等,仅为0.01,将前4个结果分开。 Symfony不远,但是Zend的速度比其他人要慢十倍。
>
>内存使用量和文件结果的数量正在变得可预测,并且在执行时间内看到的容器之间的划分相同。
>测试5 - 注入服务
>>最终测试是查看可以构建对象并注入服务的速度。这采用格式:
<span>$user = $container->get('User');</span>
>测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi
> 令人惊讶的是,PHP-DI是该任务最慢的,Zend首次将其位置领先于PHP-DI和Symfony。
结论
仅在性能上,骰子,光环和奥尔诺都是强大的竞争对手,骰子在最终测试中的总体上最快,光环最快。两个不同的组之间的区别很明显,但是比较每个容器的特征有趣的。功能和性能的数量不会像您期望的那样完全相关。 PHP-DI和DICE都包含独特的功能,但PHP-DI为此而受到了沉重的表现。 Aura虽然很快,但需要大量的手动配置,并且正如您所期望的那样,具有很小的功能,而骰子和Orno的性能非常相似,但需要更少的配置代码。 在所有测试中,Symfony在所有测试中都非常重要,尽管与AURA一样,将其配置为一项更加困难的任务,因为既不支持类型的参数。如果您正在寻找一个众所周知的项目中的容器,那么Symfony必须成为首选的容器,如果性能很重要。
也就是说,如果您之后纯粹的表现是什么,那么Dice和Aura就是Orno非常接近的明显赢家。但是,值得一提的是配置语法和每个功能,以查看您希望与之合作,因为骰子,Aura和Orno之间的性能差异对于任何真实的应用都可以忽略不计。 所有测试的代码均可在GitHub上获得。请注意:GitHub存储库包含所测试的库的副本,而不是使用作曲家将它们包括在项目中,这是为了确保您可以使用我测试的精确版本运行代码并获得相同的结果。 >> PHP依赖注入集装箱性能基准
的经常询问问题(常见问题解答)PHP依赖注入容器性能基准的重要性是什么?这些基准提供了对各种容器的比较分析,帮助开发人员根据其特定需求做出明智的决定。他们在记忆使用和时间消耗方面提供了对每个容器的性能的见解,这是优化PHP应用程序性能的关键因素。 >依赖性注入容器在PHP中如何工作? >> PHP中的依赖注入类型是什么?构造函数是通过类构造函数提供依赖项的地方。 Setter注入涉及通过方法提供依赖项。接口注入要求依赖类要实现一个接口,该接口将注入依赖项。
>
>依赖注射如何有助于PHP中的更好的测试?班级的依赖项。这允许在测试过程中嘲笑或固执,使您可以孤立地测试类。这也使编写单元测试变得更容易,因为您可以注入可提供可预测响应的模拟依赖项,从而使您的测试更加可靠且更易于编写。依赖性注入与PHP中的固体原理有何关系?
以上是PHP依赖注入容器性能基准测试的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。
