【问题标题】:Performance: condition testing vs assignment性能:条件测试与分配
【发布时间】:2011-06-01 10:15:15
【问题描述】:

我创建了一个循环,其中一个变量用于测试循环的当前运行是否是第一个。它相当简单:

$firstrun = true;
while(condition){
  if($firstrun)
    // Do this
  else
    // Do that

  // Change $firstrun to false
}

我只是想知道(主要是出于好奇,因为我没有真正明显的区别),当我需要将 $firstrun 更改为 false 时,在分配之前测试变量是否为 true 会更有效在每次运行期间将其设置为 false 还是简单地将其重新分配为 false?

例如:

$firstrun = true;
while(condition){
  if($firstrun)
    // Do this
  else
    // Do that

  if($firstrun)
    $firstrun = false;
}

或者干脆

$firstrun = true;
while(condition){
  if($firstrun)
    // Do this
  else
    // Do that

  $firstrun = false;
}

PS: 我想这也是一个不好的例子,因为将$firstrun 的重新分配与原始条件一起重新分配是最有效的,但正如我所说,这是出于好奇,所以我想只是假装这不是某些人的选择原因。

PSS: 当我遇到这个想法时,我正在使用 PHP 进行编码,但我猜测解决方案将与语言无关。只是想我会把它扔在那里,以防它出于某种原因很重要。

那么最终,条件测试或变量赋值哪个更快?

【问题讨论】:

  • 对于 PHP,可能有一个绝对的答案,但作为一个与语言无关的问题,唯一真正的答案是:profile it!

标签: php performance conditional variable-assignment


【解决方案1】:

以上都不是

$firstrun = true;
while(condition)
{
  if($firstrun)
  {
    $firstrun = false;
  }
  else
  {
  }
}

我这么说的原因,因为您反复将 false 重新分配给 $firstrun,您应该在第一个循环中执行此操作

condition test vs assignment which is faster?

例如你展示的,是一样的(一个执行周期没有一些昂贵的调用)

更新

我认为条件测试会更慢,因为之后你可能会调用一系列后续操作

【讨论】:

  • 并不是说速度差异真的很重要。 :)
  • 感谢 ajreal。我想我应该只是将我的代码完全用于示例。这一切发生的真正原因是我的代码之间的差异对于第一次运行来说是如此之小,以至于我实际上使用三元运算符来处理差异,我喜欢它,因为它大大提高了代码的可读性,但显然我不能在三元中包含代码块,因为这会破坏它的目的,所以我打算在最后做它,如上所示。但是,正如你所说的 l,条件测试会更慢,这就是我真正需要知道的 :)
【解决方案2】:

这可能会更好,这取决于 condition 实际上是什么:

if (condition) {

    //execute first run code

    while (condition) {
        //execute subsequent run code
    }
}

根据您的示例,您不需要额外的变量。

如果您知道代码将始终至少运行一次,您甚至不需要 if 语句:

//execute first run code

while (condition) {
    //execute subsequent run code
}

【讨论】:

    【解决方案3】:
    <?php
    
    class Test
    {
        private $var = 156135135;
        const SOMETHING = 156135135;
    
        public function assign()
        {
            $this->var = self::SOMETHING;
        }
    
        public function conditionalAssign()
        {
            if ($this->var != self::SOMETHING) {
                $this->var = SELF::SOMETHING;
            }
        }
    
    }
    
    $obj = new Test;
    
    $start = microtime(true);
    for ($i = 1; $i < 10000000; ++$i) {
        $obj->assign();
    }
    echo round((microtime(true) - $start) * 1000, 2).' ms'.PHP_EOL;
    
    $start = microtime(true);
    for ($i = 1; $i < 10000000; ++$i) {
        $obj->conditionalAssign();
    }
    echo round((microtime(true) - $start) * 1000, 2).' ms'.PHP_EOL;
    

    当变量为整数时,conditionalAssign 总是更快,当变量为布尔值时通常更快,当变量为字符串时,通常更快。

    【讨论】:

      猜你喜欢
      • 2012-02-29
      • 2018-11-18
      • 1970-01-01
      • 2020-07-18
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2022-09-30
      相关资源
      最近更新 更多