|
|
|
| Что быстрее >, < либо = ? для выполнения, скажем при работе в циклах.
for($i=0; $i!=9999999998; i++)
{
...
}
или
for($i=0; $i<9999999999; i++)
{
...
}
уважаемые гуру, что быстрее выполниться? | |
|
|
|
|
|
|
|
для: ntro123
(04.08.2012 в 15:44)
| | Неравенство можно проверить побитовым сравнением двух операндов, а больше или меньше, это вычитание с последующим анализом остатка. | |
|
|
|
|
|
|
|
для: confirm
(04.08.2012 в 16:07)
| | т.е. неравенство быстрее будет работать чем больше/меньше? | |
|
|
|
|
|
|
|
для: ntro123
(04.08.2012 в 19:45)
| | Логические операции выполняются быстрее, чем иные.
<?
$arr = range(0,399);
for($i=0, $k=count($arr); $i^$k; $i++) echo $arr[$i]."<br>";
|
| |
|
|
|
|
|
|
|
для: ntro123
(04.08.2012 в 15:44)
| | Теоретически сравнение будет быстрее... только у вас $i часом не целое? Если целое, то такие большие значения в 32-битном целом не могут быть сохранены - будет переполнение разряда. | |
|
|
|
|
|
|
|
для: ntro123
(04.08.2012 в 15:44)
| | $a = 998;
$b = 999;
for ($i = 0; $i != $a; $i++) - это медленнее
for ($i = 0; $i < $b; $i++) - это быстрее | |
|
|
|
|
|
|
|
для: Yuriev
(05.08.2012 в 20:04)
| | <
?
function t()
{
$t=explode(' ', microtime());
for($i=0; $i<10000001; $i++);
$t2=explode(' ', microtime());
return $t2[1]-$t[1]+($t2[0]-$t[0]);
}
echo (t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t()+t())/20;
?>
|
0.6915909 !=
0.6949863 <
0.6908826 <=
как видим приблизительно все одинаково. | |
|
|
|
|
|
|
|
для: ntro123
(08.08.2012 в 13:13)
| | ntro123, в вашем примере видно, что результаты не одинаковы.
Употребление "приблизительно" в программировании уместно ли, сомневаюсь.
Ваш пример на своей машине запускал несколько раз по очереди так.
С < четыре раза
0.0264358
0.02544355
0.02524505
0.02562805
С != четыре раза
0.137968
0.1359741
0.13474145
0.13392315
С < четыре раза
0.0576867
0.05738685
0.05524415
0.0532482
С != четыре раза
0.1336447
0.13286275
0.130231
0.1348729
С <= не тестировал, поскольку в первом посте этой темы так вопрос не стоял.
Если верить моей машине, то < быстрее чем !=, если верить вашей, то всё наоборот.
Почему так происходит - не знаю.
Может уважаемые участники форума поэкспериментируют на своих машинах и поделятся результатами? | |
|
|
|
|
|
|
|
для: Yuriev
(08.08.2012 в 14:20)
| | Результаты и не будут одинаковы, так как программа не выполняется монопольно, а в отведенные ей интервалы времени. Посмотрите на время вызова каждой итерации многократно:
<?
function times($d=false) {
static $arr;
if ($d) {
$tmp = $arr;
unset($arr);
return($tmp);
}
$t = explode(' ', microtime());
$arr[] = $t[0];
}
register_tick_function("times");
times();
declare(ticks=1) {
for($x=0; $x < 5; $x++);
}
echo "<pre>";
print_r(times(true));
| Прежде чем все эти тесты проводить, не мешало бы заглянуть в результирующий объектный код, который в результате может служить для какого-то сравнения.
Что касается быстродействия, то в силу аппаратной реализации выполнения инструкций процессором, самыми быстрыми являются логические операции. Это и без всякого сравнения понятно, так как проверка на равенство, это побитовое XOR двух регистров с последующим логическим ИЛИ результатов, которое формирует флаг Zero. Нужно только проверить этот флаг.
Хотя при программном тесте (тот что вы производите), результат может оказаться совсем иным. Так что ответ на вопрос кроется в объектном коде, и что php там готовит, как производит загрузку данных, и откуда куда... | |
|
|
|
|
|
|
|
для: Yuriev
(08.08.2012 в 14:20)
| | >Почему так происходит - не знаю.
зависит от версии php и от архитектуры процессора.
>Результаты и не будут одинаковы, так как программа не выполняется монопольно, а в отведенные ей интервалы времени.
Мой код более практичный, и его результатам можно верить.
Вывод: все зависит от архитектуры процессора и версии php | |
|
|
|
|
|
|
|
для: ntro123
(08.08.2012 в 17:46)
| | Это вы для меня "Мой код более практичный, и его результатам можно верить."?
Чушь полнейшая, без обиды. Ничего в нем практичного нет.
Все зависит от множества факторов. Но если вы хотите получить действительную картину, то садитесь за ассемблер, запускайтесь в защищенном режиме, и вычисляйте. Не хотите этого, значит открывайте описание системы команд конкретного процессора, смотрите сколько тактов отводится под команды, которые вам придется применить в вашей программе и вычисляйте время. Это куда более объективная картина, хотя она вам и нафик не нужна. Такое, это для критических областей, а не для php. | |
|
|
|