Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Глупый вопрос: что быстрее >, < либо = ?
 
 автор: ntro123   (04.08.2012 в 15:44)   письмо автору
 
 

Что быстрее >, < либо = ? для выполнения, скажем при работе в циклах.

for($i=0; $i!=9999999998; i++)
{
...
}

или

for($i=0; $i<9999999999; i++)
{
...
}

уважаемые гуру, что быстрее выполниться?

  Ответить  
 
 автор: confirm   (04.08.2012 в 16:07)   письмо автору
 
   для: ntro123   (04.08.2012 в 15:44)
 

Неравенство можно проверить побитовым сравнением двух операндов, а больше или меньше, это вычитание с последующим анализом остатка.

  Ответить  
 
 автор: ntro123   (04.08.2012 в 19:45)   письмо автору
 
   для: confirm   (04.08.2012 в 16:07)
 

т.е. неравенство быстрее будет работать чем больше/меньше?

  Ответить  
 
 автор: confirm   (04.08.2012 в 21:10)   письмо автору
 
   для: ntro123   (04.08.2012 в 19:45)
 

Логические операции выполняются быстрее, чем иные.
<?
$arr 
range(0,399);
for(
$i=0$k=count($arr); $i^$k$i++) echo $arr[$i]."<br>";

  Ответить  
 
 автор: cheops   (05.08.2012 в 19:42)   письмо автору
 
   для: ntro123   (04.08.2012 в 15:44)
 

Теоретически сравнение будет быстрее... только у вас $i часом не целое? Если целое, то такие большие значения в 32-битном целом не могут быть сохранены - будет переполнение разряда.

  Ответить  
 
 автор: Yuriev   (05.08.2012 в 20:04)   письмо автору
 
   для: ntro123   (04.08.2012 в 15:44)
 

$a = 998;
$b = 999;

for ($i = 0; $i != $a; $i++) - это медленнее
for ($i = 0; $i < $b; $i++) - это быстрее

  Ответить  
 
 автор: ntro123   (08.08.2012 в 13:13)   письмо автору
 
   для: 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 <=


как видим приблизительно все одинаково.

  Ответить  
 
 автор: Yuriev   (08.08.2012 в 14:20)   письмо автору
 
   для: 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

С <= не тестировал, поскольку в первом посте этой темы так вопрос не стоял.

Если верить моей машине, то < быстрее чем !=, если верить вашей, то всё наоборот.
Почему так происходит - не знаю.
Может уважаемые участники форума поэкспериментируют на своих машинах и поделятся результатами?

  Ответить  
 
 автор: confirm   (08.08.2012 в 14:40)   письмо автору
 
   для: 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 там готовит, как производит загрузку данных, и откуда куда...

  Ответить  
 
 автор: ntro123   (08.08.2012 в 17:46)   письмо автору
 
   для: Yuriev   (08.08.2012 в 14:20)
 

>Почему так происходит - не знаю.

зависит от версии php и от архитектуры процессора.

>Результаты и не будут одинаковы, так как программа не выполняется монопольно, а в отведенные ей интервалы времени.

Мой код более практичный, и его результатам можно верить.

Вывод: все зависит от архитектуры процессора и версии php

  Ответить  
 
 автор: confirm   (08.08.2012 в 18:13)   письмо автору
 
   для: ntro123   (08.08.2012 в 17:46)
 

Это вы для меня "Мой код более практичный, и его результатам можно верить."?
Чушь полнейшая, без обиды. Ничего в нем практичного нет.
Все зависит от множества факторов. Но если вы хотите получить действительную картину, то садитесь за ассемблер, запускайтесь в защищенном режиме, и вычисляйте. Не хотите этого, значит открывайте описание системы команд конкретного процессора, смотрите сколько тактов отводится под команды, которые вам придется применить в вашей программе и вычисляйте время. Это куда более объективная картина, хотя она вам и нафик не нужна. Такое, это для критических областей, а не для php.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования