Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > строки и переменные


Автор: Rtm 16.6.2006, 13:29
Код

$y = "word";

объясните разницу, плз, между:
Код

$x = "hello $y !"

и
Код

$x = "hello ".$y." !";
 

Автор: skyboy 16.6.2006, 13:33
Rtm, выдаёт одинаковый результат. Значит, идентично. Как на меня, правда, то второй вариант нагляднее. Хотя, интуиция подсказывает мне, что в первом случае вызывается чё-то типа inline-подстановки, а во втором - явно вызывается функция с передачей параметров... пойду, протестирую... 

Автор: BobiKK 16.6.2006, 13:37
Результат будет один. 
Конструкция "hello $variable" выполнится немного быстрее. Однако, конструкции типа "hello trim($variable)" - недопустимы. В то время как "hello".trim($variable) - нормально
Кроме того, могут возникнуть проблемы с ипользованием ассоциативных массивов. Т.е., "hello $array['first']" может иногда приводить к ошибкам. 

Автор: Mal Hack 16.6.2006, 13:44
И где тут функция есть?

Цитата(BobiKK @  16.6.2006,  14:37 Найти цитируемый пост)
Конструкция "hello $variable" выполнится немного быстрее.

Да????

Вот интерпретатор получает на вход строку, начинает ее парсить. Быстрее будет работать вариант с точками. Второй вариант, когда переменная указывается внутри строки и в {}, третий - просто $var... 

Автор: skyboy 16.6.2006, 13:50
Код

for($i= 0; $i< 10000;$i++) 
 {
  $y= rand(1,1000);
  echo "one ".$y." two";
 }
for($i= 0; $i< 10000;$i++) 
 {
  $y= rand(1,1000);
  echo "one $y two";
 }

Этот код был прогнан через профайлер, который в аттаче. Вот результат:
Код

  1    111.8588 ms (32.05 %)  concat
  1    222.1160 ms (63.63 %)  inline

"Concat"- это я так назвал явный вариант с точками, а "inline" - вариант с внесением переменной внутрь строки.
Потом я подмал,что причина может быть в порядке вычислений и поменял местами варианты. Правда, результат мало изменился:
Код

  1    150.9390 ms (39.25 %)  concat
  1    231.5259 ms (60.21 %)  inline

Потом я подумал, и увеличил счётчик до 100000.
Код

  1    2985.5781 ms (50.40 %)  concat
  1    2936.4960 ms (49.57 %)  inline

Разница исчезла. Видимо, это была какая-то лажа, с подсчётом. Или же... Нет предела идиотизму smile Я поставил счётчик на 1000000 и получил 
Код

  1    83479.7170 ms (64.27 %)  concat
  1    46403.3411 ms (35.73 %)  inline

Причём результат устойчивый smile С чем связано такое смещение производительности, я не знаю, но тут явно какая-то фишка есть smile Может, кто объяснит? 

Автор: BobiKK 16.6.2006, 14:05
Код

<?php
function getmicrotime()
{
   list($usec, $sec) = explode(" ", microtime());
   return ((float)$usec + (float)$sec);


$time_start = getmicrotime();
for ($i = 0; $i < 30000; $i++)
{
    $array[$i] = "hello $i";
}

$time_end = getmicrotime();
$time = $time_end - $time_start;


$time2_start = getmicrotime();
for ($i = 0; $i < 30000; $i++)
{
    $array2[$i] = "hello ".$i;
}

$time2_end = getmicrotime();
$time2 = $time2_end - $time2_start;


$time3_start = getmicrotime();
for ($i = 0; $i < 30000; $i++)
{
    $array3[$i] = "hello {$i}";
}
$time3_end = getmicrotime();
$time3 = $time3_end - $time3_start;

echo "First: ".$time."<br>";
echo "Second: ".$time2."<br>";
echo "Third: ".$time3."<br>";
?>


First: 0.0955958366394
Second: 0.0795040130615
Third: 0.0952532291412

Признаю, фигню сказал smile 

Автор: Mal Hack 16.6.2006, 14:05
skyboy,  Неправильный у тебя тест. Делали мы уже где-то подобное. Тестировать надо в трех разных файлах, только тогда у тебя может быть реальное полоджение дел.
Плюс, выкинуть y из цикла. 

Автор: Guedda 16.6.2006, 16:27
Точки ставятся чисто для удобства. Чтобы можно было потом код разобрать. Моё ИМХО.
И ещё, если нечаянно ошибешься, и вместо этого:
Код

x = "Hello, $y";

напишешь:
Код

x = 'Hello, $y';

то на экране появится:
Код

Hello, $y

Вот и всё отличие, я думаю...  

Автор: Mal Hack 16.6.2006, 16:40
Цитата(Guedda @  16.6.2006,  17:27 Найти цитируемый пост)
Вот и всё отличие, я думаю...  

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

Автор: skyboy 17.6.2006, 18:43
Mal Hack, разве цикл не даёт усреднение результатов?
Ок. Протестирую в разных файлах. А нельзя ваши тесты где-нить глянуть? 

Автор: Mal Hack 17.6.2006, 23:37
Цитата(skyboy @  17.6.2006,  19:43 Найти цитируемый пост)
Mal Hack, разве цикл не даёт усреднение результатов?

Вот если ты затестируешь на 50 разных машинах, по 100 раз, на 10 разных системах, на разных серверах, и т.п. Вот тогда это будет усреднение. smile

Цитата(skyboy @  17.6.2006,  19:43 Найти цитируемый пост)
Ок. Протестирую в разных файлах. А нельзя ваши тесты где-нить глянуть?  

Не смог их найти. Либо на этом форуме где-ть, либо на форуме вовеба. 

Автор: Rtm 19.6.2006, 07:52
так какой же вывод ? 

Автор: Mal Hack 19.6.2006, 08:09
Через точки. 

Автор: Штык 19.6.2006, 09:51
хммм..на мой взгляд вариант с точками более читаем в коде..и это плюс) 

Автор: Kefir 19.6.2006, 10:19
точки. читабельнее, и, всё-таки, быстрее. где-то была подобная тема уже. и там тестировали. 

Автор: vasac 19.6.2006, 10:36
А с единичными кавычками еще быстрее, потому что строки разбираться не будут.
Код

$x = 'Hello ' + $y


А вообще — http://php.spb.ru/php/speed.html 

Автор: skyboy 20.6.2006, 13:53
vasac,  спасибо за инфо smile
 smile 
Цитата(Mal Hack @  17.6.2006,  23:37 Найти цитируемый пост)
Вот если ты затестируешь на 50 разных машинах, по 100 раз, на 10 разных системах, на разных серверах, и т.п. Вот тогда это будет усреднение. 

Откуда у студента колбаса?  smile 
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)