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

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
继续使用PHP:耐力的原因继续使用PHP:耐力的原因Apr 19, 2025 am 12:23 AM

PHP仍然流行的原因是其易用性、灵活性和强大的生态系统。1)易用性和简单语法使其成为初学者的首选。2)与web开发紧密结合,处理HTTP请求和数据库交互出色。3)庞大的生态系统提供了丰富的工具和库。4)活跃的社区和开源性质使其适应新需求和技术趋势。

PHP和Python:探索他们的相似性和差异PHP和Python:探索他们的相似性和差异Apr 19, 2025 am 12:21 AM

PHP和Python都是高层次的编程语言,广泛应用于Web开发、数据处理和自动化任务。1.PHP常用于构建动态网站和内容管理系统,而Python常用于构建Web框架和数据科学。2.PHP使用echo输出内容,Python使用print。3.两者都支持面向对象编程,但语法和关键字不同。4.PHP支持弱类型转换,Python则更严格。5.PHP性能优化包括使用OPcache和异步编程,Python则使用cProfile和异步编程。

PHP和Python:解释了不同的范例PHP和Python:解释了不同的范例Apr 18, 2025 am 12:26 AM

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP和Python:深入了解他们的历史PHP和Python:深入了解他们的历史Apr 18, 2025 am 12:25 AM

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

在PHP和Python之间进行选择:指南在PHP和Python之间进行选择:指南Apr 18, 2025 am 12:24 AM

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP和框架:现代化语言PHP和框架:现代化语言Apr 18, 2025 am 12:14 AM

PHP在现代化进程中仍然重要,因为它支持大量网站和应用,并通过框架适应开发需求。1.PHP7提升了性能并引入了新功能。2.现代框架如Laravel、Symfony和CodeIgniter简化开发,提高代码质量。3.性能优化和最佳实践进一步提升应用效率。

PHP的影响:网络开发及以后PHP的影响:网络开发及以后Apr 18, 2025 am 12:10 AM

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?PHP类型提示如何起作用,包括标量类型,返回类型,联合类型和无效类型?Apr 17, 2025 am 12:25 AM

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。

See all articles

热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

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

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具