Forum Webscript.Ru

Программирование => PHP => Тема начата: Ленивый гость от 02 Октября 2002, 11:59:02

Название: if ($a_row[type] == 2){?????}
Отправлено: Ленивый гость от 02 Октября 2002, 11:59:02
Вот такой скрипт делает ХТМЛ таблицу предприятий.
$db_name = "test";
$table_name = "company";

$connection = @mysql_connect("localhost", "admin", "gramozeka")
                           or die(\'Не могу подключиться к серверу баз данных\');
             @mysql_select_db($db_name, $connection)
                       or die(\'Не могу открыть базу данных\');

$sql = "select title, city, man, tel, type from $table_name order by title desc";
 
  $result = mysql_query($sql,$connection)
  or die("Couldn\'t execute query.");
 
@$num_rows = mysql_num_rows($reult);
while ($a_row = mysql_fetch_array ($result))
      {
      print "\\n";
      print "\\t$a_row[title]\\n";
      print "\\t$a_row[city]\\n";
      print "\\t$a_row[man]\\n";
      print "\\t$a_row[tel]\\n";
      print "\\t$a_row[type]\\n";
      print "\\t\\n";
      }
         ?>
         
Поле type - имеет формат int. Скрипт в результате работы возвращает в поле type циферки
У меня это от 1 до 6, что соответствует типу предприятия:

1 - автозаправка
2 - нефтяная база
3 - оптовая база
4 - представитель компании

ну и т.д.

Уж очень мне хочется, чтобы вместо циферок в таблице были типы предприятий.
Название: if ($a_row[type] == 2){?????}
Отправлено: Меняздесьдавнонет от 02 Октября 2002, 12:46:40
Мда, тяжелый случай.
Советовать сделать еще одну таблицу я уж и не суюсь - гость-то ленивый.
про массивы что-нибудь почитать - та же фигня. Лень человеку основы программирования изучить.
Название: if ($a_row[type] == 2){?????}
Отправлено: ThE0ReTiC от 02 Октября 2002, 12:53:13
Ленивый гость
А ты на странице комментарии напиши. Тогда все поймут, что цифирьки означают.
Название: if ($a_row[type] == 2){?????}
Отправлено: Меняздесьдавнонет от 02 Октября 2002, 15:31:44
$types=array(
1 => "автозаправка",
2 => "нефтяная база",
3 => "оптовая база",
4 => "представитель компании"
);

$type=$a_row[type];
print "\\t".$types[$type]."\\n";
Название: if ($a_row[type] == 2){?????}
Отправлено: PilotV от 02 Октября 2002, 15:48:20
print "\\t{$TYPES_ARRAY[$a_row[type]]}\\n";
Название: if ($a_row[type] == 2){?????}
Отправлено: PilotV от 02 Октября 2002, 15:52:33
[OFF]Ну не люблю я точку юзать - без нее красивее[/OFF]
А что касается точки в echo/print, так уж лучше все же запятая
Название: if ($a_row[type] == 2){?????}
Отправлено: Alexandr от 02 Октября 2002, 16:53:56
Цитировать
Ну не люблю я точку юзать - без нее красивее

А юзать надо
http://php.spb.ru/php/speed.html
Название: if ($a_row[type] == 2){?????}
Отправлено: PilotV от 02 Октября 2002, 19:29:35
Alexandr

Во-первых, у RomikChef одномерный массив, который (по этому источнику) выносить не надо. Да и вообще если уж это не присваивание переменной, а вывод echo/print, то лучше использовать запятые, а не точки (там таких тестов не проводили, но полагаю, что по сравнению с точками ускорение будет намного ощутимее, чем у точек по сравнению с внутристрочным написанием).

Во-вторый, уже у меня не совсем многомерный массив (который "надо выносить"), а 2 одномерных массива (элемент одного - это индекс другого). Именно такого эксперимента там не рассмотрено, поэтому в этом случае однозначно говорить, что так хуже мы не можем, пока не подтвердим экспериментом (а я эксперимент ставить не буду, ибо меня этот вопрос вообще мало чешет).

В-третьих, я данные той статьи не проверял сам :), а потому степень моего доверия к тем данным <100%. Поскольку интуитивно + основываясь на моих знаниях и представлениях о компиляции/интерпретации мне кажется, что не дожно быть это медленнее (конечно, в исходники ПХП я не полезу - не такой это важный вопрос). А если даже в статье даные верны, то 20% - для меня вполне допустимо.

В четвертых, не ставился эксперимент, а потому неизвестно, что будет с соотношением времени при большом числе переменных в строке и, соответственно, с большим количеством конкантенаций (точек). Я лично думаю, что ситуация повернется с точностью до наоборот. Предпосылки такие:
- Точка - это одна операция конкантенации строк. Для каждой такой операции нужно выделить буфер под результат и скопировать в него по очереди 1-ю и 2-ю строку.
- У ПХП есть некий "компилятор", который переводит исходный код в нечто более удобное и быстрое. Точка - это конструкция языка, переменная вне кавычек - тоже, и вся операция конкантенации, вероятно, транслируется в более быстрый байт-код.
- Для сторок же в двойных кавычках, по идее, на этапе выполнения (а не компиляции) запускается некий парсер, находящий в ней спецсимволы и переменные, и если переменная найдена, ее надо разобрать. Это, вероятно, медленнее, чем синтаксический разбор при компиляции.
В этом я, собственно, как не уверен, как не уверен и в том, что строки на этапе компиляции совсем-совсем не обрабатываются, но просто это возможное объяснение замедлению.
- Когда переменных больше 1, то для _каждой_ точки должна выполниться описанная выше процедура. Парсер же строки должен запуститься всего 1 раз.
- При малом количестве переменных точка может быть быстрее за счет оптимизации кода при компиляции. При большом же количестве переменных я очень подозреваю, как написал выше, что ситуация может повернуться наоборот, потому против выделения буфера под строку 1 раз + парсинг строки будет стоять много операций по выделению буфера и переливанию результатов.
В общем, реально как работает я ПХП не знаю, и все эти выкладки основаны на моих представлениях о том "как должно быть" и некоторых знаниях из теории трансляции, поэтому могут быть ошибочными. Но я считаю их довольно верояными.

В-пятых (одних из самых важных), в целом эти эксперименты и полученные данные - немного спекулятивные. Поскольку в нормальной более менее приличной программе все эти "ускоряемые" операции представляют относительно небольшой процент кода, и занимают относительно небольшой процент ОБЩЕГО времени выполнения. В итоге если такими мучениями по "оптимизации" мы получим ускорение оптимизированного кода даже на 30-40%, то общее ускорение составит, дай-то бог, процентов 10. Мне кажется, что для таких программ адекватнее будет свои силы посвятить оптимизации алгоритмов. Если же (что обычно и бывает) в программе активно идет работа с БД, то там вообще основное время будет занимать именно выполнение запросов СУБД, и с ними вообще эроценты повышения производительности будут незаметны.
Что же касается обычных среднестатистических скриптов, или же таких, в которых 2 килобайта кода "посвящены" принтам и эхам, то в 99.99% случаев оптимальность и быстродействие - некритичные для них величины :).
И если взять это все на фоне:

В-шестых, читабельность, понятность, красота кода, удобство работы с ним и модификации лично для меня - весьма важный критерий, намного поважнее проблемы будет ли моя программа выполняться 0.5 секунды или 0.52 секунды.

Основываясь на написанном, плевал я на оптимизацию методом выноса переменных (любого вида) из кавычек, а также на разные прочие оптимизации из той серии. Я предпочитаю писать красивый и удобный код.
Хостеры же такие "перегрузки" с моей стороны, думаю, как-нибудь выдержат...
Название: if ($a_row[type] == 2){?????}
Отправлено: Alexandr от 03 Октября 2002, 09:45:34
Цитировать
Я - так - думаю

А я иначе. :-)
[OFF]Нифига себе поэму написал :-)[/OFF]
Название: if ($a_row[type] == 2){?????}
Отправлено: rembo от 03 Октября 2002, 11:12:22
Даа если все "по полочкам" разложить из этого целая статьяб вышла :).
А вообще я в какой-то мере поддерживаю PilotV. Зачастую любую программу нужно оптимизировать не выносом из кавычек переменны, а пересмотром общей логики и ключевых алгоритмов реализации. Хотя конечно очевидные приемущества того или иного метода реализации того или иного кусочка кода игнорировать ради удобства не серьезно.
Название: if ($a_row[type] == 2){?????}
Отправлено: Alexandr от 03 Октября 2002, 11:56:37
Цитировать
пересмотром общей логики и ключевых алгоритмов реализации

Я тож за это!
Но кое где можно жертвовать удобством ради хоть какого-то увеличения скорости, тем более если к этому привык.
И ещё...
Все доводы Пилота построены на: "я не ставил эксперимент, но" ("я думаю" || "мне кажется").
Вот если бы он реально протестил, то пользы было бы намного больше.
Неплохая бы статья получилась.
Название: if ($a_row[type] == 2){?????}
Отправлено: PilotV от 03 Октября 2002, 16:57:03
Цитировать
Хотя конечно очевидные приемущества того или иного метода реализации того или иного кусочка кода игнорировать ради удобства не серьезно.

Я всегда за _принципиальную_ оптимизацию - алгоритмическую. Жертвовать же такой специфичной для данной версии компилятора оптимизацией ради нормального кода - вполне серьезно (особенно на фоне "в-пятых"). Все-таки у хостеров сейчас не 486-е стоят. Или очень хочется бороться за снижение загрузки оплачиваемого сервера с 30% до 29.95% и 5 милисекунд разницы в сгорости генерации страницы?
Цитировать
Все доводы Пилота построены на: "я не ставил эксперимент, но" ("я думаю" || "мне кажется").
Вот если бы он реально протестил, то пользы было бы намного больше

"Я думаю" и "мне кажется" касаются только непосредственно операции конкантенации по сравнению с переменной в кавычках (и при этом базируются не только на интуиции, а на логике). Остальные моменты - объективны (я так думаю :))
Эксперимент - как будет нечего делать, может и поставлю. Но как я написал, меня в общем-то этот вопрос реально мало чешет (на основании остальных соображений). Так что пусть эксперименты ставит тот, кого этот вопрос так беспокоит, как тебя ;)
Название: if ($a_row[type] == 2){?????}
Отправлено: Ленивый гость от 03 Октября 2002, 20:44:37
PilotV Ну просто супер ответ!
Честное члово, очень приятно.
Я писем-то таких длинных никогда не получал.

Огромное спасибо!!!! Тебе
Название: if ($a_row[type] == 2){?????}
Отправлено: Alexandr от 04 Октября 2002, 10:04:44
Цитировать
Остальные моменты - объективны (я так думаю)

СУПЕР!!!!

Цитировать
Так что пусть эксперименты ставит тот, кого этот вопрос так беспокоит, как тебя

Да меня это тоже не сильно-то волнует.
Пусть каждый делает так, как считает правильным.
Название: if ($a_row[type] == 2){?????}
Отправлено: Доктор от 05 Октября 2002, 00:13:08
[OFF]
Цитировать
Остальные моменты - объективны (я так думаю)

СУПЕР!!!!

Юмор это был, ИМХО.
[/OFF]
Название: if ($a_row[type] == 2){?????}
Отправлено: PilotV от 05 Октября 2002, 04:41:49
В следующий раз не забуду поставить смайлик, обещаю...