PHP日期函数和Carbon哪个更快?

8

Carbon是一个简单的PHP API扩展,用于DateTime。我想知道我们是否可以通过安装composer来使用Carbon日期时间函数。

哪个更快,PHP日期时间函数还是Carbon?


2
文档表明Carbon简单继承了\DateTime,按常识使用\DateTime直接调用相同或稍微慢一点的函数。 Carbon的好处在于添加了功能/便利功能。 - ccKep
@ccKep 谢谢。那么,我将直接使用 PHP Datetime 函数。 - Sharad B
@ccKep,针对当前日期时间,我比较了Datetime和Carbon函数。结果发现Carbon函数的执行速度比核心Datetime函数更快。 - Sharad B
你可能想要发布用于测试的实际代码。 - ccKep
2个回答

27

我对您关于DateTime和Carbon函数进行比较的评论进行了一些测试:

调用Carbon::now()new \DateTime()各10万次:

<?php

require "Carbon.php";

use Carbon\Carbon;

$carbonTime = 0;
for ($i = 0; $i < 100000; $i++)
{
    $start = microtime(true);
    $time = Carbon::now();  
    $end = microtime(true);

    $carbonTime += $end - $start;
}

echo "carbonTime: ".$carbonTime."\n";

$phpTime = 0;
for ($i = 0; $i < 100000; $i++)
{
    $start = microtime(true);
    $time = new \DateTime();
    $end = microtime(true);

    $phpTime += $end - $start;
}

echo "phpTime: ".$phpTime."\n";

运行 5 次的结果(即 5x 100,000 次调用):

$ php test.php
carbonTime: 5.1191372871399
phpTime: 0.42734241485596

$ php test.php
carbonTime: 5.05357670784
phpTime: 0.41754531860352

$ php test.php
carbonTime: 5.4670262336731
phpTime: 0.42954564094543

$ php test.php
carbonTime: 5.0321266651154
phpTime: 0.44966721534729

$ php test.php
carbonTime: 5.1405448913574
phpTime: 0.4540810585022

确认我最初写的内容:

由于Carbon继承了\DateTime,因此它对这些调用增加了一点开销(Carbon -> DateTime而不是直接DateTime)。 Carbon的主要目的不是比DateTime更快,而是通过常用函数增强其功能。


8

如果2022年或以后读到这篇文章的人,PHP的速度已经有了很大的提升,在PHP 8.1中,ccKep代码的结果将是:

$ php test.php
carbonTime: 0.72775316238403
phpTime: 0.27025842666626

$ php test.php
carbonTime: 0.75773358345032
phpTime: 0.27719449996948

$ php test.php
carbonTime: 0.75334858894348
phpTime: 0.26076078414917

$ php test.php
carbonTime: 0.75232911109924
phpTime: 0.26331186294556

$ php test.php
carbonTime: 0.75696325302124
phpTime: 0.27505803108215

有一点额外的开销。但是使用操作方法时,这种开销开始增加。

我添加了一些操作代码:

<?php

require "Carbon.php";

use Carbon\Carbon;

$carbonTime = 0;
for ($i = 0; $i < 100000; $i++)
{
    $start = microtime(true);
    $time = Carbon::now();
    $time->addMinute();
    $end = microtime(true);

    $carbonTime += $end - $start;
}
echo "carbonTime: ".$carbonTime."\n";

$phpTime = 0;
for ($i = 0; $i < 100000; $i++)
{
    $start = microtime(true);
    $time = new \DateTime();
    $time->add(new DateInterval('PT1M'));
    $end = microtime(true);

    $phpTime += $end - $start;
}

echo "phpTime: ".$phpTime."\n";

$carbonPhpTime = 0;
for ($i = 0; $i < 100000; $i++)
{
    $start = microtime(true);
    $time = Carbon::now();
    $time->add(new DateInterval('PT1M'));
    $end = microtime(true);

    $carbonPhpTime += $end - $start;
}
echo "carbonPhpTime: ".$carbonPhpTime."\n";

结果:

$ php test.php
carbonTime: 1.9114277362823
phpTime: 0.33648467063904
carbonPhpTime: 0.85358047485352

$ php test.php
carbonTime: 2.0271127223969
phpTime: 0.35125756263733
carbonPhpTime: 0.90319967269897

$ php test.php
carbonTime: 1.8688952922821
phpTime: 0.33922410011292
carbonPhpTime: 0.85987377166748

$ php test.php
carbonTime: 1.8911855220795
phpTime: 0.33247566223145
carbonPhpTime: 0.86109066009521

$ php test.php
carbonTime: 1.8757562637329
phpTime: 0.33344697952271
carbonPhpTime: 0.84496641159058

如您所见,当进行操作时,差异会增加。因此,如果您需要大量进行日期/时间操作,则可能会很繁琐。

您还可以看到我添加了一个组合,在该组合中,我使用Carbon实例化了一个DateTime对象(因为Carbon扩展了DateTime类),同时使用DateTime方法进行操作,以查看是否有任何差异,因为“setTestNow()”在进行单元测试时非常方便。

我的建议是在选择Carbon时要非常小心。如果您不同时使用大量Carbon(例如在简单的网站上),则可以充分利用它,但是当需要快速操作大量数据时,我的建议是:使用DateTime或仅使用Carbon :: now()以便于测试,并继续使用DateInterval的易于使用的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接