目录
钥匙要点
测试1 - 创建一个对象的实例
这也可能触发了容器所做的任何内部缓存,但是对每个容器都采用了相同的处理,以使其保持公平
测试4 - 从容器中获取服务
测试5 - 注入服务
结论
> PHP中的依赖注入类型是什么?构造函数是通过类构造函数提供依赖项的地方。 Setter注入涉及通过方法提供依赖项。接口注入要求依赖类要实现一个接口,该接口将注入依赖项。
>
首页 后端开发 php教程 PHP依赖注入容器性能基准测试

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

Feb 20, 2025 pm 12:23 PM

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

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

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

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

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

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

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

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

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

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

框架安全功能:防止漏洞。 框架安全功能:防止漏洞。 Mar 28, 2025 pm 05:11 PM

文章讨论了框架中的基本安全功能,以防止漏洞,包括输入验证,身份验证和常规更新。

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

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

PHP 8.1中的枚举(枚举)是什么? PHP 8.1中的枚举(枚举)是什么? Apr 03, 2025 am 12:05 AM

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

See all articles