额外的变量或对象创建 – 在PHP中更好的是什么?

PHP中更好/更快/更高效的是什么?

使用额外变量:

$dateStep = new DateInterval('P1D');

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add($dateStep) : $startDate;

    ...
}

或者每次需要时创建对象:

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add(new DateInterval('P1D')) : $startDate;

    ...
}

我投票给第一个选项,但我在PHP中的优化和性能知识非常有限.

编辑:似乎,我没有表达足够的,但我特别要求这样的场景 – 当对象的创建返回静态值时,在后续循环中反复使用.

解决方法

从另一个角度来看这个,让我们来看看脚本和操作码:

SCRIPT1:

<?PHP

$dateStep = new DateInterval('P1D');
$dateInterval = 5;
$startDate = new DateTime();

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add($dateStep) : $startDate;

    //...
}

操作码:

number of ops:  26
compiled vars:  !0 = $dateStep,!1 = $dateInterval,!2 = $startDate,!3 = $di,!4 = $theDate
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   3     0  >   FETCH_CLASS                                   4  :0      'DateInterval'
         1      NEW                                              $1      :0
         2      SEND_VAL                                                 'P1D'
         3      DO_FCALL_BY_NAME                              1          
         4      ASSIGN                                                   !0,$1
   4     5      ASSIGN                                                   !1,5
   5     6      FETCH_CLASS                                   4  :5      'DateTime'
         7      NEW                                              $6      :5
         8      DO_FCALL_BY_NAME                              0          
         9      ASSIGN                                                   !2,$6
   7    10      ASSIGN                                                   !3,0
        11  >   IS_SMALLER_OR_EQUAL                              ~10     !3,!1
        12    > JMPZNZ                                        F          ~10,->25
        13  >   PRE_INC                                                  !3
        14    > JMP                                                      ->11
   9    15  >   IS_SMALLER                                       ~12     0,!3
        16    > JMPZ                                                     ~12,->22
        17  >   INIT_METHOD_CALL                                         !2,'add'
        18      SEND_VAR                                                 !0
        19      DO_FCALL_BY_NAME                              1  $14     
        20      QM_ASSIGN_VAR                                    $15     $14
        21    > JMP                                                      ->23
        22  >   QM_ASSIGN_VAR                                    $15     !2
        23  >   ASSIGN                                                   !4,$15
  12    24    > JMP                                                      ->13
        25  > > RETURN                                                   1

SCRIPT2:

<?PHP


$dateInterval = 5;
$startDate = new DateTime();

for($di = 0; $di <= $dateInterval; ++$di)
{
    $theDate = ($di > 0) ? $startDate->add(new DateInterval('P1D')) : $startDate;

   // ...
}

操作码:

number of ops:  25
compiled vars:  !0 = $dateInterval,!1 = $startDate,!2 = $di,!3 = $theDate
line     # *  op                           fetch          ext  return  operands
---------------------------------------------------------------------------------
   4     0  >   ASSIGN                                                   !0,5
   5     1      FETCH_CLASS                                   4  :1      'DateTime'
         2      NEW                                              $2      :1
         3      DO_FCALL_BY_NAME                              0          
         4      ASSIGN                                                   !1,$2
   7     5      ASSIGN                                                   !2,0
         6  >   IS_SMALLER_OR_EQUAL                              ~6      !2,!0
         7    > JMPZNZ                                        A          ~6,->24
         8  >   PRE_INC                                                  !2
         9    > JMP                                                      ->6
   9    10  >   IS_SMALLER                                       ~8      0,!2
        11    > JMPZ                                                     ~8,->21
        12  >   INIT_METHOD_CALL                                         !1,'add'
        13      FETCH_CLASS                                   4  :10     'DateInterval'
        14      NEW                                              $11     :10
        15      SEND_VAL                                                 'P1D'
        16      DO_FCALL_BY_NAME                              1          
        17      SEND_VAR_NO_REF                               0          $11
        18      DO_FCALL_BY_NAME                              1  $13     
        19      QM_ASSIGN_VAR                                    $14     $13
        20    > JMP                                                      ->22
        21  >   QM_ASSIGN_VAR                                    $14     !1
        22  >   ASSIGN                                                   !3,$14
  12    23    > JMP                                                      ->8
        24  > > RETURN                                                   1

现在您可以在第二个脚本的操作码中看到它每次迭代都会创建一个新的类实例,并且您创建了一个巨大的开销,这似乎是您不需要的(在第二个操作码中查看#* 13 – 16),所以首先,您要创建完全不必要的新实例,然后再降低性能.

因此,只要您在每次迭代时都不需要一个全新的类,第一个脚本就更适合您,因为它只创建一次DateInterval对象并将其分配给变量.

还有一点额外的信息:

> example 1
> example 2
> VLD extension
> ZE2 opcode

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...