Производительность: тестирование условий и назначение - PullRequest
2 голосов
/ 30 декабря 2010

Я создал цикл, в котором переменная используется для проверки того, является ли текущий проход цикла первым.Это довольно просто:

$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, когда эта идея меня поразила, но я полагаю, что решение будет зависеть от языка.Просто подумал, что я добавлю это туда, если это по какой-то причине имеет значение.

Итак, в конечном итоге, что быстрее, проверка условий или присвоение переменной?

Ответы [ 3 ]

4 голосов
/ 30 декабря 2010

ничего из вышеперечисленного

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

причина, по которой я так сказал, потому что вы повторно присваиваете значение false для $firstrun, что вы должны сделать в первом цикле

condition test vs assignment which is faster?

например, вы показали, это то же самое (один цикл выполнения без дорогостоящего вызова)

обновлено

Я думаю, что тестирование условий будет медленнее, потому что после этого вы можете вызвать серию последующих действий

1 голос
/ 30 декабря 2010

Это может быть лучше, в зависимости от того, что на самом деле condition:

if (condition) {

    //execute first run code

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

В вашем примере вам не нужна дополнительная переменная.

Вы даже ненужен оператор if, если вы знаете, что код будет выполняться хотя бы один раз:

//execute first run code

while (condition) {
    //execute subsequent run code
}
0 голосов
/ 30 марта 2016
<?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 всегда быстрее, когда переменная целочисленная, часто быстрее, когда переменная логическая, и почти равна, когда переменная строковая.

...