Crazy PHP world

Sep 14
2007 00:56 (PHP) · Русский (8,930 views)

We are living in XXI century, but PHPists can’t decide yet how to write: "text $b" or 'text ' . $b. I’m going slightly mad.

via Artjom Kurapov’s blog.

52 Responses to this entry

Subscribe to comments with RSS or TrackBack to 'Crazy PHP world'.

DM @
said on 2007-09-14 at 2.09 am

With computing power that we have today it doesn’t matter.

Btw, RubyOnRails has the power =)

said on 2007-09-14 at 2.23 am

Это относится не только к PHPистам. Вот пример на C#:

1
"text " + b

vs

1
string.Format("text {0}", b)
said on 2007-09-14 at 9.13 am

И что, ASP.NET-разработчики высчитывают, сколько миллисекунд займет каждая из приведенных строк? В ASP.NET все просто — StringBuilder если генерить строку из кучи кусочков, String.Format если нужно сгенерить строку для пользователей (потому что обычно “text {0}” хранится в ресурсах), и String.Concat (т.е. +) — если чего-нить внутрисистемное сгенерить (например, ID какой-нибудь).

Если честно, то я вообще не считаю, что выбор метода склейки строк в обычном приложении для пользователей (Web- или WinForms) так уж сильно влияет на перфоманс, что это вообще может кто-то заметить. Обычно либо неудачно реализованная работа с базой, либо использованы дубовые алгоритмы.

said on 2007-09-14 at 9.15 am

Ну что я могу сказать. В ряде случаев удобней писать в двойных кавычках, как в твоем примере.
А вот в одинарных удобней, если скажем HTML код пишешь, пример:

1
$html = '<a href="/" class="link" id="link" name="link">'.$arr['row'][0].'</a>'

Так что в разных случаях, разное удобней.

А от куда, кстати, такие мысли, мол решить не могут, с ума сходят и т.д.? Уже около 2х лет пишу на PHP не когда подобные мысли не лезли в голову. Чем больше методов реализовать задачу, тем лучше!!!

said on 2007-09-14 at 9.25 am

на эти вопросы есть (ИМХО) однозначные и ПРАВИЛЬНЫЕ ответы:

1. 'писать надо так'.$a
2. в сад "

said on 2007-09-14 at 9.26 am

There is new holly war about “savings on matches” ?

said on 2007-09-14 at 9.34 am

2BlackByte
Удобнее HTML выносить из PHP.

Разделяй логику и представление… брат!
Пис вам чуваки

said on 2007-09-14 at 9.43 am

2LeKz
ну если уж разделять, тогда по хорошему вообщем нужно вот так писать

1
2
3
4
<?
 $a='Hello World';
?>
<a href="/"><?=$a?></a>

Не о шаблонах сейчас речь, а писать или не писать кавычки… я говорю, что хорошо что есть и такие и такие. В разных задачах удобней и те и те! Быть обоим!

said on 2007-09-14 at 11.23 am

Обычно производительность упирается в работу с БД… и еще я думаю не намногих сайтах используется кэширование данных и HTML :(

said on 2007-09-14 at 12.00 pm

Вот и я о чем говорю. Глупо оптимизировать приложение, заменяя " на ' по всему приложению. Тем более, что

1
"Hello, $name. You are $age years old."

читается намного лучше, чем

1
'Hello, '.$name.'. You are '.$age.' years old.'

(это просто ИМХО, и если у вас в команде считается, что с ' код становится понятнее,– используйте именно такой вид кавычек).

Товарищи, лучше оптимизируйте базу, настройте кэширование и выложите в SVN код, легкий для чтения и сопровождения, чем протирайте штаны в поисках лучшей по перфомансу генерации строк.

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

Я бы не делал этого поста (тем более про PHP не собирался уже писать в блоге), но блин чуть ли не каждую неделю кто-нибудь напишет, что ' быстрее. Детский сад!

said on 2007-09-14 at 12.12 pm

Критик. Где логика? Зачем говоря о машинах вспоминать о памперсах?

Был затронут вопрос кавычек и конкатенации, а значит вполне уместно говорить об оптимизации именно этих операций.

Относительно оптимизации бд, кэше - ты прав, но это другая песочница или другая история.

said on 2007-09-14 at 12.23 pm

Оптимизация производительности отдельных частей приложения направлена на оптимизацию скорости выполнения всего приложения в целом. Т.е. исходная задача у нас — сделать приложение быстрее (и точно никто не ставит задачу оптимизировать склейку строк). Для достижения поставленной задачи есть два пути:

  1. Мелочный — заменить " на ', foreach на for.
  2. Оптимальный — настроить кэширование, оптимизировать работу с базой, заменить пузырьковую сортировку на quick sort.

Зачем тратить время на первый способ, если вы не получите существенного прироста? Строки в бизнеслогике клеятся по минимуму, основная масса таких операций — в шаблонизаторе. Которые уже тысячу лет назад написаны. Потому я и утверждаю, что это идиотизм — сидеть и вычислять, какую долю секунды займет склейка строк ', а какую — подстановка переменных в ".

said on 2007-09-14 at 12.41 pm

Кпум. Ты мне вмазал, но пропускай повторный.

Я пропускаю твой и соглашаюсь со всем сказанным тобой, но зачем вновь о памперсах? :)

Или давай так. Пускай будет идеальный случай. Мы оптимизировали все, что только можно (разве такое бывает?) и осталось только это. В это случае будет уместно говорить о том “какую долю секунды займет склейка строк ‘, а какую — подстановка переменных в “.” ?

Повторюсь еще раз. Все оптимизировано именно для того, что бы увести тебя от мысли оптимизировать что-либо другое т.к тут был начал разговор конкретно по теме.

З.Ы. взирая на методы, которые были применимы в случае с PHP3 понимаешь, что СЕЙЧАС много уже не уместно (мощности увеличиваются), но кто его знает.. может когда и понадобится

said on 2007-09-14 at 12.53 pm

2LeKz: Вот ответь, положа руку на сердце, хоть раз в жизни тебе приходилось опускаться до оптимизации склейки строк? Я имею в виду насущную необходимость, а не просто “от скуки сел и все строки перефигачил”.

Если приложению не хватает производительности, то это не проблема программиста, выбравшего ", а одна из возможных проблем:

  • Администратор базы данных криво настроил СУБД
  • Неправильная настройка веб-сервера(ов)
  • Приложение недостаточно масштабируется
  • Начальство зажопило деньги на новый сервер
  • Неправильная, слишком усложненная архитектура

Но я уверен на 200%, строки в падении производительности не виноваты. Да, если ты везде заменишь двойные кавычки на одинарные, твое приложение сможет обслужить не 300 пользователей, а 320. И что это значит? Да ничего! Решение любого из перечисленных мной пунктов даст прирост больше шести процентов (цифры взяты с потолка, но думаю, они отражают реальное положение вещей). Намного больше.

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

said on 2007-09-14 at 12.55 pm

Да, забыл сказать. Никогда не бывает такого, что все идеально настроено, а проблема только в строках :-) Это самообман. Привыкайте не видеть проблем там, где их и действительно нет.

said on 2007-09-14 at 12.59 pm

Кпум, неа. Не приходилось. А от скуки было :)

З.Ы. Да. Боинги! Клево!!!

said on 2007-09-14 at 1.15 pm

Простите, достопочтенные, что вмешиваюсь…
Давно уже не писал на PHP, но еще и не все забыл (наверное).

Согласен с BlackByte, что “Чем больше методов реализовать задачу, тем лучше”.

2 LeKz:
Не понимаю сравнения машин и памперсов, каким это боком касается конкатенации строк?

Согласен к Критиком, что строки винить не в чем при падении производительности, как практика показывает(показывала) - часто производительность падает(падала) от “криво” написанных запросов к БД.

З.Ы. Сам всегда писал

1
'text '.$b

и никогда не задумывался над оптимизацией СТРОК.

said on 2007-09-14 at 3.02 pm

За меня уже тут многое сказали. Дело не в мелочности, а в привычке. Я сам пишу ‘test’.$a не потому что это быстрей (я сам это узнал недавно), а просто потому что подсветка кода у меня так работает правильно. Но если знать такие элементарные особенности языка, то в будующем написанный код будет быстрее (если это коренным образом не влияет на читаемость кода).
Я и про оптимизацию загрузки страниц в целом писал, так что не сочтите за узость кругозора.

said on 2007-09-14 at 3.35 pm

2Артём: Знаю, что писал :-) Иначе не читал бы твой блог. А насчет строк — это просто было последней каплей. Я действительно натыкаюсь на очень много подобных штук, и многие люди действительно считаю, что после оптимизации строк, все проблемы решаются сами собой.

COTOHA
said on 2007-09-14 at 6.54 pm

вот ужоснах :) вот чесно - меня тоже бесит, что боян про оптимизацию пхп приложений перепечатывают уже 3й год ещё и без линка на оригинал. как тока новый пхпист заводит блог так что? вот оно самое.

но. критик, может ты про дотнет почитаешь?

если пхписты тупо копипастят бояны, то дотнетчики ещё и пишут тесты “using high resolution timer class found on codegear”. при чём постоянно :) мало того - некоторые показывают что “+” быстрее стринг_билдера и искренне недоумевают нах он тогда впал.

а к чему я это всё? ага. к тому, что ПХПисты - это дохера миллионов человек, а крик души у тебя вызывает 1 конкретный пост, про вопрос который волнует исчезающе малый процент людей. итак - с чего ты взял, что ПХПисты что-то там не могут решить? ПХПисты вообще решительнейшие люди на земле - после того, как они таки решились таки бросить ПХП4 (кстати ещё 1 пост, который меня утомил), я не вижу ничего, что бы им было не под силу :) :) :)

COTOHA
said on 2007-09-14 at 6.59 pm

ну и понудеть:

> PHPists are still can’t decide

не стыдно, а?

said on 2007-09-14 at 8.25 pm

2COTOHA: Про .НЕТ читаю, и видел про стрингбилдер. Эта тема поднимается довольно часто как на forums.asp.net, так и на rsdn.ru, но в блогах, на которые подписан (а их сильно больше, чем блогов по пхп в моем ридере), такая тема не поднималась. Но вообще да, есть темы, которые бесят там.

Теперь по поводу собственно вышеозначенного поста. ПХПисты — народ не только решительнейший, но и сильно увлекающийся. Т.е. если что-то вычитывают интересное, то сразу тянут в свой проект (это я сужу по себе в молодости и по людям, с которыми приходилось работать). Если написать в блоге, которому доверяет среднестатистический ПХПшник, что ADODB — говно, тормозит, и вообще сильно большой оверхед, из проекта удаляется эта обертка на базами, и либо юзаются прямые запросы, либо пишется своя библиотека (сам писал, каюсь). Если сказать, что ADODB — мощнейшая и удобнейшая библиотека, решает сразу тыщу миллионов проблем, и при этом работает очень быстро,– все, удаляются все свои наработки, PEAR::DB, прямые запросы, и добавляется ADODB. Бывают еще замечательные варианты (подскажи, никсовая библиотека, которую юзает весь харьков, с ее NDatabase, относится к таким?), когда пишется мегаобертка над библиотеками PEAR::DB и ADODB, чтобы можно было переключать их в конфиге. То же самое касается популярных ныне MVC фреймворков, различных CMS и плеяды более мелких инструментов. И главное, тут и сказать особо нечего — это как женская логика, все по-своему правы.

Я все это говорю не к тому, что выбор — это плохо, а к тому, что увлекаться надо вмеру. Вот собственно кавычки — одно из повальных увлечений. В свое время и я, и мои коллеги бросились заменять все двойные кавычки на одинарные, потому что так быстрее. Тьфу-тьфу, со временем я научился отделять зерна от плевел, чего и вам желаю.

Прошу прощения у всех, кого обидел в этом комменте, я говорил, опираясь исключительно на мой печальный опыт работы с ПХП и ПХПистами.

А насчет предложения, неа, не смущает. Я ж никогда не говорил, что знаю инглиш. Так, просто пытаюсь. Может подскажешь, как правильно, запомню тогда на будущее…

COTOHA
said on 2007-09-15 at 1.22 am

> ПХПисты — народ не только решительнейший,
> но и сильно увлекающийся.
> …
я наверное какой-то неправильный пхпист был :) искренне верю, что 98% такие же как я. всё интересное, что вычитано, мотается на ус и в будущем _возможно_ используется… ведь если солнце садится на западе, а встает на востоке и это проверено и работает, то кто ж его будет трогать? тока ненормальные, но я их не знаю… или они хорошо нычутся :)

> Может подскажешь, как правильно,
> запомню тогда на будущее…
PHPисты до сих пор не могут решить = PHPist can’t decide yet (или till now) (2 вспомогательных глагола низя: are + can’t)

если охота выпедрится, то = PHPist are still in an endless quest for Holy Grail of the True Quote

said on 2007-09-15 at 10.05 am

Спасибо. Надо все-таки выучить инглиш каким-нибудь образом…

said on 2007-09-15 at 11.53 am

Ух-ты!
А я тож когда на PHP писал, то юзал NDatabase.
Хочу поблагодарить - тогда она меня вполне устраивала, да и сейчас наверное устроила бы, если бы пришлось что-то писать на PHP.

З.Ы. Это мой первый коммент с Мак’а :)

said on 2007-09-15 at 4.16 pm

Во, ф тему:

Как отличить PHP-шника?
Он везде использует одинарные кавычки.

Источниг:
http://anekdot.ru/id.html?308355

erka
said on 2007-09-15 at 4.55 pm

hi
iphone at macstore
kyiv karavan

said on 2007-09-15 at 5.32 pm

Наверное стОит объяснить, почему я заапрувил предыдущий коммент, который очень похож на спам. Это мои друзья erka и STan тестили iPhone в “Караване” киевском. Вот, теперь у меня в блоге есть один коммент, отправленный с этого чудо-девайса :-)

ЗЫ. Топик превратился в оффтопик-генератор, потому пишите, что думаете обо всем на свете: PHP, iPhone, Украине и Киеве в частности, обо мне гадостном,– буду аппрувить все (кроме откровенного спама, конечно). Во как :-)

said on 2007-09-15 at 8.57 pm

Вот это флейм устроили. Убил бы каждого за любую оптимизацию на этапе разработки. Вот недавно нашел статические переменные на конекшины к базе данных в многопоточных вызовах. Можно только радоваться, что нашел. Так что ' или " — никакой разницы. Присоединяюсь к http://kpumuk.info/php/crazy-php-world/#comment-96643

PS. iPhone понравился. Говорят после нового года будет в Украине.

said on 2007-09-15 at 9.52 pm

Супер!
Спросите о чем это я?
Конечно об iPhone!
Очень впечатлила вещица!
Но я начинаю побаиваться (если или когда я его куплю) приносить его домой, потому что iPod nano недавно был успешно постиран и, конечно, не работает :(
Кто что посоветует креативного? :)

COTOHA
said on 2007-09-15 at 10.47 pm

опа. ифон через ви-фай или они его на какого-то оператора перевели (я ж ниче не пропустил и разлоченых ифонов официально не продают?!)?

said on 2007-09-16 at 7.23 am

[...] в блоге Dmytro Shteflyuk’s Home о нескончаемых спорах php программистов о том, как лучше писать ‘this text [...]

said on 2007-09-16 at 10.07 am

2 СОТОНА:
iPhone там работает через Wi-Fi, привязки ни к одному оператору у них нет. Поэтому нельзя потестировать отправку смс и других GSM-функций.
iPhone не то, чтобы разлоченных, а вообще никаких не продают официально…

said on 2007-09-17 at 9.59 am

Вариант

1
"text $b"

хоть и красивее, но работает медленнее, чем

1
'text ' . $b

а ещё быстрей работает

1
echo 'text', $b

так как не надо склеивать строки.
Всё это конечно не имеет значения по большому счёту, но если надо выжимать скорость для мега проекта - то это имеет место

said on 2007-09-17 at 10.19 am

Вот об этом я и говорил. Ведь мегапроект — это большой проект на ПХП, а не драйвера видеокарты? В большом проете ты не выжмешь никакой скорости, если будешь оптимизировать строки. Я уже несколько раз об этом писал!

said on 2007-09-17 at 10.26 am

Да, вот кстати аналогичная обсуждаемой статья от предыдущего оратора, BlackCat.

said on 2007-09-17 at 11.36 am

Думаю дело даже не в производительности, хотя мне один раз пришлось “перефигачивать”. но это долгая история.
Все гораздо проще ).
Дело в том, что подсветка синтаксиса даст нам что:

1
echo "hello $a";

hello $a - строка

1
echo 'hello '.$a;

hello - строка; $a - переменная.

Намнго улучшается читабельность и ускоряется отладка

said on 2007-09-17 at 11.44 am

Неужели нет редакторов хороших для ПХП, которые подсвечивают нормально строки с переменными?

COTOHA
said on 2007-09-17 at 12.23 pm

есть конечно (и Zend и Eclipse). но имхо ж дело в не этом, а в том, что раз есть блог, то надо писать. а тут начинаются проблемы :) кстати, критик, на - с пылу с жару:
http://blog.cumps.be/string-concatenation-vs-memory-allocation/

я так вижу это для всех проблема :) на этот счёт посоветую прочитать Якова Фейна

said on 2007-09-19 at 9.35 am

После своего последнего коммента, решил ещё раз зайти и прочитать новые. Написаши много, осилил.

Узнал даже что то новое для себя, за что спасибо. Хотел только для BlackCat’а прокоментировать его примеры. Последний его пример не самый быстрый. Быстрей все же будет:

1
<? $b='text'; ?>text <?=$b; ?>

В отличии от его примера:

1
echo 'text', $b

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

RaR
said on 2007-10-05 at 11.41 am

Просто не смог устоять. К данному флейму как нельзя лучше относится статья Джоэля

Harvy @
said on 2007-11-07 at 2.09 pm

Предлагаю любителям двойных кавычек начать писать по человечески:

1
print "text {$b}"
said on 2007-12-03 at 2.09 am

Как по мне - так второй способ удобнее.
Да и все дело в привычке…

said on 2007-12-19 at 5.20 pm

Оптимизировать, так Оптимизировать!
‘строка ‘ . $variable;

akalend
said on 2007-12-21 at 11.08 pm

известный факт код: “text $b” будет исполняться медленнее, чем ‘text ‘ . $b;
но первый вариант изящнее.

said on 2008-02-04 at 6.34 am

[...] тут недавно у одного адепта, что не имеет смысла оптмизировать строки и писать в [...]

said on 2008-02-04 at 7.30 am

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

Кончайте заниматься ерундой!

said on 2008-02-04 at 10.35 am

я нуп совсем в блоггинге :) не ожидал что запалюсь так ;)

зы: работать скрипт будет быстрей это факт все равно :) и для этого ненунжно циклы разворачивать или еще каких нить извратов, просто ставить ‘ ‘ :) берегите шифт

said on 2008-02-07 at 1.03 am

Вот это пост! Столько всего написали, что пока дочитал мысль о комменте материализовалась в этот текст.

А теперь по пунктам:
IPhone - прекрасная вешь если у вас прошивка 1.1.1 - т.к. ломается за 15 минут при наличии только WiFi.

Конкатенция строк: Здесь пожалуй соглашусь с тем что нужно использовать по ситуации, т.к. в моем случае, при разделении кода и шаблонов а уж тем более в CMS системе.

Варианты типа

1
<? $b='text'; ?>text <?=$b; ?>

Отпадают сами собой по причине “калечности” кода и опять таки в случае с CMS если уж и использовать такой метод то придеться добавлять какие нибудь ob_start() методы для его последующего отлавливания. В крупном проекте HTML в коде это просто неприемлемо имхо.

А на сет скорости и кавычек тут все просто - нужно только заглянуть в недра PHP и увидеть, следующее:
При использовании

1
$a = 'text' . $a;

PHP просто соединяет переменные.
А в случае с
При использовании

1
$a = "text $a";

Он сначала ищет их в строке а потом производит операции замены…

Что уже есть +1 действие (поиск).

Ну и на конец как быть тогда с такими вариантами?

1
$a = 'text' . get_new_text($b.'new') . $a . 'finish';

Тут можно еще много тем поднять типа:
1) стоит ли писать скобки у print(’asdasd’);
2) что быстрее print или echo?
3) в каком из низ конкатенция происходит быстрее?
и прочее =)

Всем удачи, пост понравился =)

CutePro
said on 2008-04-12 at 6.31 am

The style

1
echo "My name is $myname";

is called string interpolation. it will take more time when comparing to the string concatenation style

1
echo 'My name is '. $myname;

if you do benchmark test of these notations you can find the difference.

the second one is the recommended practice.
Happy Programming !!!!!

DmitriKadykov
said on 2008-05-09 at 8.59 am

Если про PHP - конкатенация быстрей интерполяции. Но я использую её по той причине, что не хочу при заморачиваться с интерпояцией, ставить эти фигурные скобки, если передаётся что ни-будь типа $a[i]. Разница в производительности несущественна, это дело вкуса, равно как и выбор стиля кода. Нормальные разработчики о вкусах не спорят.

said on 2008-07-04 at 10.36 pm

Сидел полчаса писал комментарий к статье - вдумчиво, серьезно. Забыл написать имя и e-mail - все данные пропали. Шел бы ты лесом, Дмитрий (…дальше нецензурно…) - я еще понимаю, от неопытных пользователей такой сюрприз, но от программиста…

Post a comment

You can use simple HTML-formatting tags (like <a>, <ul> and others). To format your code sample use <code lang="php">$a = "hello";</code> (allowed languages are ruby, php, yaml, html, csharp, javascript). Also you could use <code>$a = "hello";</code> and its syntax would not be highlighted. If you are not using <code> tag, replace < sign with &lt;.

Submit Comment

 
Copyright © 2005 - 2008, Dmytro Shteflyuk