PHP — торговый центр Сала — это $emo, а торговый центр Сала — это .$emo — строка с эффективностью конкатенации кавычек

В PHP, что является лучшим способом конкатенации строк (с одинарной кавычкой) с точки зрения ресурсов?

"Sal's mall is $emo."

Or:

"Sal's mall is ".$emo.'.'

Or:

'Sal\'s mall is '.$emo.'.'

person ina    schedule 03.08.2010    source источник
comment
Зависит от ситуации, обычно, если вы можете, я бы использовал первый метод, возвращаясь ко второму, если нужно, и, наконец, к третьему. Я не думаю, что здесь можно получить огромное преимущество в эффективности, это скорее ремонтопригодность.   -  person studioromeo    schedule 03.08.2010
comment
Если вы можете позволить себе роскошь оптимизировать синтаксический анализ строк, ваше приложение уже работает очень быстро, поэтому вы должны чувствовать себя очень уверенно. Скорость парсинга строк никогда не будет вашим узким местом.   -  person nikc.org    schedule 03.08.2010
comment
Вот почему все презирают PHP - из-за всех этих ответов ниже.   -  person Your Common Sense    schedule 03.08.2010
comment
Вот почему PHP программистов презирают. :P Я не против PHP; Я возражаю против людей, которые пишут ужасно искаженный код, чтобы выжать дополнительный цикл процессора из разбора строки, вместо того, чтобы чинить свои сломанные алгоритмы.   -  person cHao    schedule 04.08.2010
comment
нет ничего плохого в том, чтобы пытаться писать эффективный бережливый код. не тратьте ресурсы, когда они не нужны. все это складывается   -  person ina    schedule 04.08.2010
comment
нет ресурсов, чтобы тратить их впустую. и, по правде говоря. покажи мне свое приложение, и я укажу тебе вещи, которые потребляют в 1000000 раз больше ресурсов, чем эти бедные цитаты, о которых ты так беспокоишься.   -  person Your Common Sense    schedule 04.08.2010
comment
@ina: Нет ничего плохого в том, чтобы пытаться писать эффективный код, пока вы не войдете в режим туннельного зрения, где вы пытаетесь создать строку как можно быстрее, вместо того, чтобы смотреть на более широкую картину и видеть, что вы вероятно, использует в 1000000 раз больше мощности процессора где-то еще. 0,0001%, которые вы могли бы сэкономить, используя лучший метод, ничто по сравнению с этим уродливым алгоритмом, который потребляет в миллионы раз больше вычислительной мощности, чем ему необходимо. И это даже не говоря о дополнительном времени, которое вам потребуется для мысленного разбора и поддержки формата, с которым вы не знакомы.   -  person cHao    schedule 04.08.2010
comment
хорошо, дело в том, что я на самом деле знаком с более сложным для чтения форматом, который может быть немного более эффективным. но это потому, что я долго кодил в шкафу (не спрашивайте). теперь я смотрю на код других людей и замечаю, что они очень по-разному форматируют свои строки. поэтому я подумал, какой из них лучше, мог бы также пойти к этому. удивлен, обнаружив, что трудный для чтения способ, к которому я привык, на самом деле более эффективен (даже немного)   -  person ina    schedule 04.08.2010
comment
в любом случае, если код в этой одинарной кавычке труднее читать, вы можете просто написать деобсфукатор, чтобы преобразовать его в двойные кавычки   -  person ina    schedule 04.08.2010
comment
нет, это просто дело вкуса (или согласия). погуглите coding standards, чтобы получить пример таких соглашений. и просто помните правило: никакие проблемы с синтаксисом не могут реально повлиять на производительность. только манипулирование данными может. и учись профилированию   -  person Your Common Sense    schedule 04.08.2010


Ответы (5)


'Sal\'s mall is '.$emo.'.'

Третий способ более эффективен (немного). Вы можете проверить это самостоятельно, выполнив цикл:

for ($i = 0; $i < 100000; $i++) {
    // enter code here 
}
person Bald    schedule 03.08.2010
comment
Это бесполезный тест. Он не проверяет ничего реального. Вы не можете найти никакой разницы в реальном приложении. Научитесь использовать профилирование вместо таких нелепых циклов - person Your Common Sense; 03.08.2010
comment
@полковник Shrapnel, Вопрос вообще не в этом. - person strager; 06.08.2010
comment
@strager слишком плохо для вопроса - person Your Common Sense; 07.08.2010

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

person Anax    schedule 03.08.2010
comment
+1 по правде говоря, я никогда не сталкивался с ситуацией, когда узким местом были струны. - person Kristoffer Sall-Storgaard; 03.08.2010

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

person Hamid Nazari    schedule 03.08.2010
comment
PHP в любом случае будет анализировать строки в одинарных кавычках. Хотя бы найти заключительную цитату. - person Your Common Sense; 03.08.2010
comment
И в любом случае ему также придется анализировать . и $emo. - person strager; 06.08.2010

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

person philfreo    schedule 03.08.2010

Разницы нет.
Изучите профиль своего приложения, прежде чем задавать вопросы, связанные с производительностью.

person Your Common Sense    schedule 03.08.2010
comment
Есть очень небольшая разница, но на нее не стоит обращать внимание. Выигрыш в ремонтопригодности намного перевешивает разницу в паре циклов процессора. - person cHao; 04.08.2010
comment
@cHao нет, нет. да и в ремонтопригодности выигрыша нет - person Your Common Sense; 04.08.2010
comment
@полковник Шрапнель: Есть. Измерять не стоит, но он есть. Вы формируете строку двумя довольно разными способами: либо все сразу (со строкой в ​​двойных кавычках), либо объединяя 3 строки вместе. Так что есть что рассмотреть. Кроме того, в строке с одинарными кавычками PHP не выполняет интерполяцию (что меняет время, необходимое для инициализации строки). - person cHao; 04.08.2010
comment
Добавьте к этому, что "There are $count lights" легче читать, и сложнее испортить кавычки, пробелы и тому подобное (читай: легче поддерживать), чем 'There are '.$count.' lights'.. - person cHao; 04.08.2010
comment
@cHao PHP doesn't interpolate - ну и что? он все еще чертовски интерполируется перед конкатенацией. то же действие, другое место. этим вы не можете спасти PHP от интерполяции переменной. вам нужно интерполировать переменную и инициализировать результирующую строку В ЛЮБОМ СЛУЧАЕ. разве ты не видишь? - person Your Common Sense; 04.08.2010
comment
Вне строки переменная не интерполируется — она просто извлекается. "I say $x" нужно искать переменные для замены, и это немного больше, чем просто поиск знаков доллара. 'I say '.$x нет, но есть стоимость конкатенации. Строка создается двумя разными способами, поэтому следует ожидать, что они будут иметь разные характеристики производительности. Но опять же, производительность достаточно схожа, поэтому редко стоит заботиться о том, что быстрее — удобочитаемость превосходит микрооптимизацию. - person cHao; 04.08.2010
comment
@cHao, где он ищет переменные и почему он не ищет за пределами строки? в чем разница между интерполяцией и просто извлечением? Обуздай немного свою фантазию, а? - person Your Common Sense; 04.08.2010
comment
Интерполяция — это замена переменной в строке ее значением. IE: замена $foo значением $foo. В этом нет необходимости, если строка заключена в одинарные кавычки, а добавление значения переменной к строке — это другая операция, чем его интерполяция в строку. Тот факт, что вы этого не видите или не видите, не делает его менее верным. - person cHao; 05.08.2010
comment
См. stackoverflow.com/questions/13620/ и обратите внимание на время в принятом ответе. Конечно, видя этот вопрос и ответ, я должен проголосовать за закрытие. - person cHao; 05.08.2010
comment
@cHao, лол. вы все еще не видите, что для строки RESULTING у нас все еще есть все эти операции. и ваша волшебная интерполяция - не более чем просто конкатенация. строкового содержимого и значения переменной. - person Your Common Sense; 05.08.2010
comment
Интерполяция и конкатенация - разные вещи. Вы не можете сделать Есть $x источников света, используя только строку «Есть $x источников света» и конкатенацию. Вам нужно либо заменить '$x' на значение $x, либо во время выполнения решить, как разбить строку на части, которые можно объединить. И это решение требует времени. - person cHao; 05.08.2010
comment
о, да. это решение требует времени. огромная разница - person Your Common Sense; 07.08.2010
comment
Я не говорил, что это огромная разница. На самом деле, я говорил почти противоположное — что любая разница слишком мала, чтобы о ней беспокоиться, по большому счету — все время. Но есть разница между Нет никакой разницы, из-за которой стоит терять сон и Нет никакой разницы. Последний игнорирует реальность вещей. - person cHao; 03.10.2010