首页 >后端开发 >php教程 >PHP依赖注入容器性能基准测试

PHP依赖注入容器性能基准测试

尊渡假赌尊渡假赌尊渡假赌
尊渡假赌尊渡假赌尊渡假赌原创
2025-02-20 12:23:14410浏览

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的知名度(并且尚不清楚)的容器:
    PHP-DI,一个流行的DI容器
  • symfonyDipendentibextifement,Symfony框架提供的依赖性注入容器
  • >
  • zenddi Zend Framework提供的依赖式注入容器
  • orn​​odi,一个鲜为人知的容器,具有有限的功能,但刻意
  • 的性能开发
  • 骰子,另一个鲜为人知的容器,重点是轻量级。全面披露,我是这个容器的作者,但在此分析中我将完全客观。 aura.di,一个相当受欢迎的容器,具有最少的功能
  • >
  • pimple上的单词:虽然丘疹被广告为依赖性注入容器,但是从容器中检索对象总是返回相同的实例,这使得pimple成为服务定位器,而不是依赖性注入容器,因此,无法被测试。

>尽管所有容器都支持不同的功能,但该基准测试将涵盖依赖项注入容器所需的基本功能。也就是说,创建对象并注入需要的依赖性。

将测量依赖注入的哪些方面?

执行时间

>内存使用
  1. >包括的文件数量。尽管这对性能几乎没有影响,但可以很好地指示图书馆的轻量级和便携式。如果您由于选择DI而必须用项目运送数百个文件,则可能会严重影响您自己应用程序的整体重量。
  2. 测试环境
  3. 所有测试均在运行Arch Linux(3.15内核),PHP 5.5.13和每个容器的最新版本的同一台机器上运行,截至03/07/2014。
显示的所有执行时间号平均丢弃了比最快慢20%以上的所有执行时间。

测试1 - 创建一个对象的实例

>

此测试使用每个容器创建一个简单的对象10,000倍

没有依赖注入容器,这将写为:> >测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

如您所见,这里有两个清晰的营地。 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。 aura,骰子和orno没有任何外部依赖关系,这有助于保持其文件计算。

测试2 - 忽略自动加载

由于加载文件会影响性能,Zend和PHP-DI都加载了大量文件,因此通过首先创建类的单个实例来进行相同的测试,忽略了自动加成时间,以确保在测量之前自动加载任何必需的类时间。

>

这也可能触发了容器所做的任何内部缓存,但是对每个容器都采用了相同的处理,以使其保持公平

等效的php代码:

>测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

<span>$user = new User(new Database());</span>

PHP依赖注入容器性能基准测试

如预期的那样,由于没有测量自动加载时间,记忆使用情况不变,性能稍好一些。但是,这表明php-di,即使加载42个文件也对总执行时间有忽略不计,相对性能保持不变,加载数十个文件并不是PHP-DI和Zenddi的原因相对较慢。 即使忽略了加载文件的开销,这里仍然有两个不同的球场。 Aura,Dice和Orno在性能和内存使用方面非常相似,而PHP-DI,Zend和Symfony仅在彼此之间竞争。

>未来的所有测试都会忽略自动加载的时间,以确保真正是容器的性能。

> PHP依赖注入容器性能基准测试测试3 - 深对象图

通过让容器构造这组对象10,000次来完成此测试:>

>测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

注意:您可以通过查看测试代码,Symfony,PHP-DI和AURA所看到的,与其他容器相比,需要更大的配置代码才能执行此测试。配置时间不包括在测试中。

PHP依赖注入容器性能基准测试

再次,前三名之间的区别很小,骰子比光环快20%,比Orno快70%。这三个都比Zend,PHP-DI和Symfony快得多。三个顶部容器之间的差异是如此微小,以至于您永远不会注意到像这样的人造基准之外的速度差异。

zend,php-di,在较小程度上,同伴在这里很慢。 Zend需要37秒才能在1秒内执行任务骰子管理;当然不是微不足道的差异。同样,Symfony在大名容器中带头。

PHP依赖注入容器性能基准测试

PHP依赖注入容器性能基准测试

内存和文件计数与我们在其他测试中看到的内容一致。

>

测试4 - 从容器中获取服务

di容器还必须存储和检索将在整个应用程序中重复使用的服务。该测试可反复从容器中获取一个实例。

纯PHP等效:

<span>$user = new User(new Database());</span>

>测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

PHP依赖注入容器性能基准测试

这是根据先前的结果出乎意料的。除Zend和Symfony以外的所有容器大致相等,仅为0.01,将前4个结果分开。 Symfony不远,但是Zend的速度比其他人要慢十倍。

>

PHP依赖注入容器性能基准测试

PHP依赖注入容器性能基准测试

>内存使用量和文件结果的数量正在变得可预测,并且在执行时间内看到的容器之间的划分相同。

>

测试5 - 注入服务

>

>最终测试是查看可以构建对象并注入服务的速度。这采用格式:

<span>$user = $container->get('User');</span>

>测试代码(在GitHub上):Aura,Dice,Ornodi,Php-Di,SymfonyDependentientIndixtive,Zenddi

PHP依赖注入容器性能基准测试

有趣的是,Aura在此测试中略有领先。但是,这并不是类似的测试,因为Symfony和Aura需要几行明确的配置,而其他容器会自动解决依赖关系。配置容器的时间不是基准的一部分。

> 令人惊讶的是,PHP-DI是该任务最慢的,Zend首次将其位置领先于PHP-DI和Symfony。

PHP依赖注入容器性能基准测试

结论

仅在性能上,骰子,光环和奥尔诺都是强大的竞争对手,骰子在最终测试中的总体上最快,光环最快。两个不同的组之间的区别很明显,但是比较每个容器的特征有趣的。功能和性能的数量不会像您期望的那样完全相关。 PHP-DI和DICE都包含独特的功能,但PHP-DI为此而受到了沉重的表现。 Aura虽然很快,但需要大量的手动配置,并且正如您所期望的那样,具有很小的功能,而骰子和Orno的性能非常相似,但需要更少的配置代码。 在所有测试中,Symfony在所有测试中都非常重要,尽管与AURA一样,将其配置为一项更加困难的任务,因为既不支持类型的参数。如果您正在寻找一个众所周知的项目中的容器,那么Symfony必须成为首选的容器,如果性能很重要。

也就是说,如果您之后纯粹的表现是什么,那么Dice和Aura就是Orno非常接近的明显赢家。但是,值得一提的是配置语法和每个功能,以查看您希望与之合作,因为骰子,Aura和Orno之间的性能差异对于任何真实的应用都可以忽略不计。

所有测试的代码均可在GitHub上获得。请注意:GitHub存储库包含所测试的库的副本,而不是使用作曲家将它们包括在项目中,这是为了确保您可以使用我测试的精确版本运行代码并获得相同的结果。 >

> PHP依赖注入集装箱性能基准

的经常询问问题(常见问题解答)

PHP依赖注入容器性能基准的重要性是什么?这些基准提供了对各种容器的比较分析,帮助开发人员根据其特定需求做出明智的决定。他们在记忆使用和时间消耗方面提供了对每个容器的性能的见解,这是优化PHP应用程序性能的关键因素。>> PHP依赖性注入如何改善代码质量? > PHP中的依赖注入(DI)通过促进较大的耦合,增强可测试性和增加代码可重复性来提高代码质量。通过注入依赖项,组件变得更加独立,使代码更易于修改和测试。这也鼓励单一的责任原则,因为每个班级只能做应该做的事情,从而导致更清洁,更可维护的代码。

> PHP中的依赖注入类型是什么?构造函数是通过类构造函数提供依赖项的地方。 Setter注入涉及通过方法提供依赖项。接口注入要求依赖类要实现一个接口,该接口将注入依赖项。

>依赖性注入容器在PHP中如何工作?

>

容器,管理应用程序中服务或对象的实例化和配置。它充当负责创建和返回依赖实例的工厂。它还管理共享实例,确保每次请求共享服务时都会返回一个实例。

选择依赖项注入容器时,我应该考虑哪些因素?容器,考虑诸如易用性,绩效,社区支持和与您项目兼容的因素。性能尤其重要,这是PHP依赖注入集装箱性能基准测试中用场的地方。它们提供了对各种容器的性能的比较分析,可帮助您做出明智的决定。

>

>依赖注射如何有助于PHP中的更好的测试?班级的依赖项。这允许在测试过程中嘲笑或固执,使您可以孤立地测试类。这也使编写单元测试变得更容易,因为您可以注入可提供可预测响应的模拟依赖项,从而使您的测试更加可靠且更易于编写。

>

>我可以在任何PHP项目中使用依赖项注入吗?是的,无论其大小或复杂性如何,都可以在任何PHP项目中使用依赖注入。这是一种设计模式,可促进代码可重复性,模块化性和可检验性,使其成为任何PHP开发人员的宝贵工具。

>依赖性注入对应用程序性能的影响是什么?由于额外的抽象层,可以引入轻微的开销,对应用程序性能的影响通常可以忽略不计。改善代码质量,可检验性和可维护性的好处通常超过任何较小的性能成本。

依赖性注入与PHP中的固体原理有何关系?依赖性注入与固体原理密切相关,尤其是依赖性反转原理(DIP)。 DIP指出,高级模块不应取决于低级模块,但两者都应取决于抽象。依赖注入可以通过使您能够将依赖项注入接口或抽象类,而不是具体类。通常不建议使用单个PHP项目中使用多个依赖性注入容器。使用多个容器可能会导致更难管理和理解的代码。通常最好选择一个最适合您项目需求并坚持下去的容器。>

以上是PHP依赖注入容器性能基准测试的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn