Tan Sa
127 сообщений
#15 лет назад
Да я не спорю... unset хорошая функция, если не сказать самая нужная для вообще очистки переменных.
Ваще если в коде после всяких там присваиваний и операций я вижу unset(BLA_BLA_BLA) я уже как бы
повышаю рейтинг программиста в лучшую сторону, как человека, который знает, что работает с нетипизироваными переменными
и помогает серверу очистить и освободить ресурсы.
Tan Sa
127 сообщений
#15 лет назад
Цитата:
Итак, сколько раз будет вызвано $maxi = count($array) в моем коде?


Стоп, не путаем работу ИНТЕРПРИТАТОРА PHP и код самого скрипта.

Если хотите посмотреть почему так происходит, посмотрите исходники PHP там
становится ясно, потому что вычисления и расчеты ведутся внутри php как исполняемого файла...
На самом деле php отдает только результат исполнения, а не промежуточный результат.
А время исполнения меняется...

Я если хотите могу накидать пример, как выглядит ваш код во время интерпритации.
Вадим Т.
3240 сообщений
#15 лет назад
Цитата ("sa_t_an"):
Стоп, не путаем работу ИНТЕРПРИТАТОРА PHP и код самого скрипта.

Если хотите посмотреть почему так происходит, посмотрите исходники PHP там
становится ясно, потому что вычисления и расчеты ведутся внутри php как исполняемого файла...
На самом деле php отдает только результат исполнения, а не промежуточный результат.

Ответьте на четыре вопроса вопроса.
1. Вы знаете синтаксис оператора for ?
2. Вы знаете, какое синтаксическое значение имеет , (запятая) в PHP?
3. Теперь еще раз, посмотрите на мою строку, посмотрите на Ваши слова, и ответьте для себя, при чем тут интерпретатор, исходники PHP и т.д. Потом ответьте, сколько раз вызовется мой count($array)?
4. Теперь ответьте, почему Вы написали, что мой count($array) будет вызываться при каждой итерации цикла?

Это - классика. Причем, то же самое не только в PHP, но и в Си/С++, и в Java, и в Perl, и в чем угодно.

Мне очень жаль тратить свое время... Будьте внимательнее, пожалуйста.
Вадим Т.
3240 сообщений
#15 лет назад
Цитата ("sa_t_an"):
Я если хотите могу накидать пример, как выглядит ваш код во время интерпритации.

Хочу!
Особенно интересно, в чем принципиальное отличие "во время интерпритации" моей строки

for($i=0, $maxi = count($array); $i < $maxi; $i++) { ... }

от

$maxi = count($array);
for($i=0; $i < $maxi; $i++) { ... }

кроме разве что изначальную инициализацию $i и $maxi местами поменяли
Tan Sa
127 сообщений
#15 лет назад
For($i=0, $maxi = SIZE($a); $i < $maxi+=0.5; $i++) {


echo $i;
}

Вот сдесь видно, что каждый раз строчка интерпритируется, то есть $maxi задается новое значение (как в прочем и $i) а значит
внутрях php кажен раз $maxi присваевается значение функции SIZE($a)...
Вадим Т.
3240 сообщений
#15 лет назад
Цитата ("sa_t_an"):
For($i=0, $maxi = SIZE($a); $i < $maxi+=0.5; $i++) {
echo $i;
}

Вот сдесь видно, что каждый раз строчка интерпритируется, то есть $maxi задается новое значение (как в прочем и $i) а значит
внутрях php кажен раз $maxi присваевается значение функции SIZE($a)...


Поставьте внутрь функции SIZE счетчик, и выведите значение. Как это я показал в примере выше.

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

Но если не шутите... предлагаю спор на 100 WMZ.
Сколько раз вызывается SIZE() в моем примере?
Я говорю - будет вызываться 1 раз, инициализируя переменную $maxi. Вы говорите - будет вызываться столько раз, сколько итераций в цикле. Правильно я понял?
Ну что, спорим?
Евгений Кашкаров
450 сообщений
#15 лет назад
Tan Sa
127 сообщений
#15 лет назад
Цитата:
кроме разве что изначальную инициализацию $i и $maxi местами поменяли

Не только, так как $maxi у нас значение функции, то в массив переменных уже попадёт не локальная переменная $maxi
а значение функциии, после интерпритации мы обязаны будем восстановить значения регистров (я о дзене)
но перед этим, она весь цикл будет болтаться в памяти, на предмет изменения
Вот здесь как раз пример изменения в цикле For($i=0, $maxi = SIZE($a); $i < $maxi+=0.5; $i++) {
а раз она сдесь изменяется, то и вызов функции всегда актуален, хотя бы на предмет зависимости других переменных
от функции, а вот здесь For($i=0, $i < $maxi; $i++) { $maxi - выступает в роли константы, что интерпритируется как
For($i=0, $i < 5; $i++) { (числа для примера) и не болтается без дела...
Вадим Т.
3240 сообщений
#15 лет назад
<?php
$array = array(1, 2, 33, 4, 55);
$counter = 0;

for($i=0, $maxi = SIZE($array); $i < $maxi; $i++);

echo $counter == 1 ? 'TVV - ПРАВ' : 'TVV - ЛАМЕР';

function SIZE($array) {
global $counter;
$counter++;
return count($array);
}

Что напишет этот скрипт, и почему именно он это напишет?
Владислав Усов
876 сообщений
#15 лет назад
Цитата ("Dr_Jekyll"):

Оффтопик
Такое случается только ночью))
Антон Сердюк
120 сообщений
#15 лет назад
::
*достал ложку и помешал кашу в голове у sa_t_an
/::

По теме... Ставлю 20 WMZ на tvv

__UPDATED__


Цитата:
Не только, так как $maxi у нас значение функции, то в массив переменных уже попадёт не локальная переменная $maxi
а значение функциии, после интерпритации мы обязаны будем восстановить значения регистров (я о дзене)
но перед этим, она весь цикл будет болтаться в памяти, на предмет изменения
Вот здесь как раз пример изменения в цикле For($i=0, $maxi = SIZE($a); $i < $maxi+=0.5; $i++) {
а раз она сдесь изменяется, то и вызов функции всегда актуален, хотя бы на предмет зависимости других переменных
от функции, а вот здесь For($i=0, $i < $maxi; $i++) { $maxi - выступает в роли константы, что интерпритируется как
For($i=0, $i < 5; $i++) { (числа для примера) и не болтается без дела...


Прочитал раз 5. Ничего не понял, если честно.
Tan Sa
127 сообщений
#15 лет назад
Стоп... толи мы на разных языках, толи я не о том???

Я вапще сейчас о том из чего состоит PHP.
Тоесть о парсере PHP скриптов... А именно на каком коде он написан и что ОН делает когда парсит скрипты...

В просторечьи что он делает со строкой echo 111; он переводит в инструкцию С++ вот такую
 int echo(String S args)
{


printf(S);
}


на код не обращаем внимания С хз когда пользовался...

Едим дальше... причом тут сколько раз php вызовет код??? Гораздо интереснее и вообще о чем реч, сколько раз он
его пропарсит и в какой код на Си это выльется!

По большому счету я просто не хочу сейчас перелапачивать исходники php, но идем на тынц(который я вверху оставил про оптимизацию)
и внимательно читаем о скорости исполнения и с чем это связано. А связано это с тем, что код выливается в различный после парсинга и
выполнения.

Вот этот код

echo 111;

отличается от этого

print("111");

тем, что после парсинга первого он выльется вот в этот

 int echo(String S args)
{


printf(S);
}


а после второго в этот

 int ptint(String S args)
{


S = S + 0x00;


echo(S);
}


а теперь мне ответте сколько раз вызывается echo в коде

echo 111;
print ("111";
echo 222;

так вот если вы ответите 2 - то это будет правильно с точки зрения выполнения скрипта, но на самом деле самим интерпритатором он выполнится 3 раза и ниодин раз
не выполнится print потому что print для php это его внутренняя функция echo просто с добавлением окончания строки, которая в свою очередь вытекает в вызов
внутренней функции C++ printf

Вот по этому echo в PHP исполняется БЫСТРЕЕ чем print и если дальше раскладывать PHP на косточки, поверьте мне ваш код медленнее
и не важно абсолютно сколько раз вызывается функция (она вообще не вызывается а хранится в таблице функций) но если так же ковырнуть
тарнсляцию циклов, то все станет на свои места!
Михаил В.
2195 сообщений
#15 лет назад
Оффтопик
какой интересный топик, оказывается
Tan Sa
127 сообщений
#15 лет назад
А вот вырезка из мана

Цитата:
Казалось бы, достаточно вариантов, но это не все — существует еще несколько вариантов цикла. И, как правило, именно они и используются программистами. Циклы FOR — наиболее мощные циклы в PHP. Они работают подобно их аналогам в языке программирования C. Синтаксис цикла FOR:
FOR (expr1; expr2; expr3) statement
Первое выражение (expr1), безусловно, вычисляется (выполняется) в начале цикла. В начале каждой итерации (проход цикла) вычисляется expr2. Если оно равно TRUE (истина), то цикл продолжается и выполняются вложенный(е) оператор(ы). Если оно равно FALSE (ложь), то цикл заканчивается.


У вас все правильно, но для PHP, а кокда оно транслируется в код Cи тут и могут быть грабли, поэтому луче вынести инициализацию за скобки.

ЗЫ...

Сейчас не помню, но была ограменная статейка в интернете по етому поводу... И народ расковыряв исходники порешал не отходя от кассы все что в скобках связано с вычислялками выносить за...
Млин, найти не могу...
Антон Сердюк
120 сообщений
#15 лет назад
Цитата:
У вас все правильно, но для PHP, а кокда оно транслируется в код Cи тут и могут быть грабли, поэтому луче вынести инициализацию за скобки.

Вилами по воде...
Если вы действительно понимаете, что вычисление size() в примере
for($i=0, $maxi = SIZE($array); $i < $maxi; $i++);

относится к expr1, которое
Цитата:
...безусловно, вычисляется (выполняется) в начале цикла...

тогда совсем непонятно ваше сообщение
Цитата:
For($i=0, $maxi = SIZE($a); $i < $maxi+=0.5; $i++) {
echo $i;
}
Вот сдесь видно, что каждый раз строчка интерпритируется, то есть $maxi задается новое значение (как в прочем и $i) а значит
внутрях php кажен раз $maxi присваевается значение функции SIZE($a)...
Tan Sa
127 сообщений
#15 лет назад
Ладно, обьясню проще

$maxi = SIZE($a);
For($i=0; $i < $maxi; $i++) {


по шагам

1. $maxi = SIZE($a);
2. $maxi = 10;
... Цикл
3. Сохраняем $i (0)
4. Сравниваем $i<10 ???
5. Прибавляем $i (1)
.... -> на шаг 3
4. Сохраняем $i (1)
5. Сравниваем $i<10 ???
6. Прибавляем $i (2)
.............................

For($i=0, $maxi = SIZE($a); $i < $maxi; $i++) {
... Цикл
1. Сохраняем $i (0)
2. Вычисляем $maxi = SIZE($a); $maxi = 10;
3. Сравниваем $i<10 ???
4. Прибавляем $i (1)
.... -> на шаг 1
5. Сохраняем $i (1)
6. Если $i - true и не равно начальному $i Не вычисляем $maxi = SIZE($a);
5. Сравниваем $i<10 ???
6. Прибавляем $i (2)
.............................

Даже если вводить новую переменную
Ну в общем в двух словах хрен редьки не слаще...

Ладно, едим дальше, а кто мешает перевести код в первый,

For($i=0, $maxi = SIZE($a); $i < $maxi; $i++) {

вот в такой

$maxi = SIZE($a);
For($i=0; $i < $maxi; $i++) {

И потом его распарсить?
Никто не мешает... Одно но... Это опять ресурсы парсера, а он не человек, глазами делать не умеет ничего
для него строка - это набор токенов и один код переводить в другой - это такая ж трата времени как и вызовы
и проверка переменных и функций!

ЗЫ...

Тут простейшее представление на деле все гораздо хуже.

а кто хочет потренироватцо, пускай распарсят строку
For($i=0, $maxi = SIZE($a); $i < $maxi; $i++) {
и получат
$maxi = SIZE($a);
For($i=0; $i < $maxi; $i++) {

да и посмотрят в чом отличие...
Эдуард Третьяков
269 сообщений
#15 лет назад
Вставлю свои пять копеек:
Цитата:
http://php.net/manual/en/control-structures.for.php

Здесь явно сказано, что и как нужно делать. Курим мануал. Но если даже курение не помогло, смотрим сюда:

void zend_do_for_before_statement(znode *cond_start, znode *second_semicolon_token TSRMLS_DC)
{
zend_op *opline = get_next_op(CG(active_op_array) TSRMLS_CC);

opline->opcode = ZEND_JMP;
opline->op1.u.opline_num = cond_start->u.opline_num;
CG(active_op_array)->opcodes.extended_value = get_next_op_number(CG(active_op_array));
SET_UNUSED(opline->op1);
SET_UNUSED(opline->op2);
do_begin_loop(TSRMLS_C);

INC_BPC(CG(active_op_array));
}

кусок кода интерпретатора, вызываемый для expr1 из мануала по структуре for. Файл zend_compile.c
Tan Sa
127 сообщений
#15 лет назад
А вообще точно , это ж интерпритер... и начальное и конечное значение нам вернется констанотой О_о, а поэтому на все про все нам останеца тока сравнивать и прибавлять/удалять, блин, надо завязывать не спать по ночам...

$i < sizeof($people); да с этим все понятно
тут об for($i = 0, $size = sizeof($people); $i < $size; ++$i) етом спор был

А из вышеуказаного вытекает, что тормоза быть должны !!!
Потому что используеца дополнительная функция кокда как простой цикл явно будет do_begin_loop(TSRMLS_C); с уже готовыми данными на входе...

А ваще ето у меня такая странная особливость переводить топики в другое русло или эт просто тема такая???

Все еду домой... чирез 4 часа буду наверна и токда продолжем боталии!
Кстати невростеникам напоминаю, раздражать туповатостью эт у меня от дедушки (профессора мидицыны, доктара психологичских наук)...
Александр В.
276 сообщений
#15 лет назад
2 sa_t_an
Пробуйте:

<?php
function GetSize($value){
echo "Hi<br>";
return sizeof($value);
}
$marray=array(1,2,3,4,5,6,7,8,9,10);
for($i=0, $maxi = GetSize($marray); $i < $maxi; $i++) {
echo $marray."<br>";
}
?>


Как программист я думаю нет необходимости КАЖДУЮ итерацию парсить весь цикл начиная с for.....
Даже если парсится каждый раз. Давайте подумаем логику этого процесса на второй итерации: я бы сразу отсек начало до первого вхождения ";".
Хотя да чем дальше эта ";" от начала строки тем дольше ее поиск
Антон Сердюк
120 сообщений
#15 лет назад
Фуф... Ну неужели разобрались...