Ограничения по возрасту
127 сообщений
#15 лет назад
Да я не спорю... unset хорошая функция, если не сказать самая нужная для вообще очистки переменных.Ваще если в коде после всяких там присваиваний и операций я вижу unset(BLA_BLA_BLA) я уже как бы
повышаю рейтинг программиста в лучшую сторону, как человека, который знает, что работает с нетипизироваными переменными
и помогает серверу очистить и освободить ресурсы.
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 местами поменяли
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. Вы говорите - будет вызываться столько раз, сколько итераций в цикле. Правильно я понял?
Ну что, спорим?
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 сообщений
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. Ничего не понял, если честно.
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 сообщений
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)...
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
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.....
Даже если парсится каждый раз. Давайте подумаем логику этого процесса на второй итерации: я бы сразу отсек начало до первого вхождения ";".
Хотя да чем дальше эта ";" от начала строки тем дольше ее поиск