За последние 24 часа нас посетили 18615 программистов и 1705 роботов. Сейчас ищут 693 программиста ...

Конкатенация строк. От куда разница во времени исполнения?

Тема в разделе "Прочие вопросы по PHP", создана пользователем mOOx, 12 авг 2009.

  1. mOOx

    mOOx Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    PHP:
    1. <?php
    2. echo "start: ".date("Y-m-d H:i:s")."<br />";
    3.   for ($i=0;$i<60000;$i++){
    4.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    5.     $value = 5;
    6.     $values==""?$values.="[$event_time,{$value}]":$values.=",[$event_time,{$value}]";
    7.   }
    8. echo "end: ".date("Y-m-d H:i:s");
    9.  
    Результат:
    start: 2009-08-12 00:26:06
    end: 2009-08-12 00:26:58
    52 секунды

    Изменяем 6 строку
    PHP:
    1. <?php
    2. echo "start: ".date("Y-m-d H:i:s")."<br />";
    3.   for ($i=0;$i<60000;$i++){
    4.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    5.     $value = 5;
    6.     $values.= ($values=="") ? "[$event_time,$value]" :",[$event_time,$value]";
    7.   }
    8. echo "end: ".date("Y-m-d H:i:s");
    9.  
    Результат:
    start: 2009-08-12 00:27:50
    end: 2009-08-12 00:27:57
    7 секунд

    Объясните пожалуйста, откуда такая огромная разница?
     
  2. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    вам лучше в цикле прибавлять "[$event_time,$value]," без проверок, а после цикла удалить лишнюю запятую.
     
  3. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    iliavlad, а еще можно через массив значений и join(',' $array); в конце. но вопрос у афтора интересный — надо будет написать тестик.
     
  4. mOOx

    mOOx Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Вообще задача пошла из следующей задачи: необходимо доставать из БД очень большие массивы данных, преобразовывать их в JavaScript структуры и передавать на клиента для отрисовки графика.
    Сейчас точек может быть 60000 легко. Однако нужно как-то продумать возможность быстрой передачи и большего (порядка 200000) количества точек.
    Нашел я эту особенность чисто случайно. У нас с коллегой разные стили написания кода :). Он пишет по первому варианту, а по второму. Просто решил попробовать изменить эту строку и получил очень любопытные результаты.

    А вообще хочется услышать мнения тех, кто работал с большим количеством конкатенируемых строк и с выдачей их клиенту: как это дело можно максимально оптимизировать?
     
  5. mOOx

    mOOx Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Кстати, вариант с JOIN
    PHP:
    1.  
    2.  
    3. <?php
    4. echo "start: ".date("Y-m-d H:i:s")."<br />";
    5.   $values = array();
    6.   for ($i=0;$i<60000;$i++){
    7.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    8.     $value = 5;
    9.     array_push($values,"[$event_time,$value]");
    10.   }
    11. $res = join(',',$values);
    12. echo "end: ".date("Y-m-d H:i:s");
    Результат
    start: 2009-08-12 08:03:28
    end: 2009-08-12 08:03:34
    6 секунд (еще лучше)
     
  6. mOOx

    mOOx Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Что-то мне больше никакие варианты конкатерации в голову не идут. Метод добавления элемента в массив не оказал влияния на быстродействие

    array_push($values,"[$event_time,$value]");
    и
    $values[] = "[$event_time,$value]";
    и
    $values[] = '['.$event_time.','.$value.']'; // чтобы двойные кавычки не парсились

    Варианты оказались идентичными по времени (с точностью до секунд). Пока что использование массива - самый оптимальный вариант.
     
  7. mOOx

    mOOx Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Ради эксперимента сделал по совету iliavlad (не думал, что будет лучше)
    PHP:
    1. <?php
    2. echo "start: ".date("Y-m-d H:i:s")."<br />";
    3.   for ($i=0;$i<60000;$i++){
    4.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    5.     $value = 5;
    6.     $values.=",[$event_time,$value]";
    7.   }
    8. $values = substr($values,1);
    9. echo "end: ".date("Y-m-d H:i:s");
    10.  
    Результат
    start: 2009-08-12 08:16:09
    end: 2009-08-12 08:16:15
    6 секунд (как с массивами)

    Был удивлен если честно. Теперь с точки зрения выделения памяти и прочей низкоуровневой ботвы, какая операция наиболее весомая: добавление элемента в массив или добавление строки к строке?
     
  8. mOOx

    mOOx Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Если учесть, что после создания массива в JOIN опят идет перебор всех элементов и та же самая конкатенация строк, то более дешевым способом конечно же является последний. Думаю, что на этом и остановлюсь. Хотя конкурс на самый быстрый код продолжается :).

    Да. И, конечно же, всем участвующим огромное спасибо.
     
  9. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    по сути пофиг как.

    PHP:
    1.  
    2. <?php
    3.  
    4. $for  = 100000;
    5. $sign = 5;
    6.  
    7. function microtime_float()
    8. {
    9.     list($usec, $sec) = explode(" ", microtime());
    10.     return ((float)$usec + (float)$sec);
    11. }
    12.  
    13. echo "COUNTER:     $for\n";
    14.  
    15. ###############################################################################
    16.  
    17. $start = microtime_float();
    18. $values = array();
    19. for ($i=0;$i<$for;$i++){
    20.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    21.     $value = 5;
    22.     array_push($values,"[$event_time,$value]");
    23. }
    24. $res = implode(',',$values);
    25.  
    26. $stop = microtime_float();
    27. $time = number_format($stop - $start,$sign);
    28. echo "ARRAY_PUSH:  Working in $time seconds\n";
    29. unset($values);
    30. unset($res);
    31.  
    32. ###############################################################################
    33.  
    34. $start = microtime_float();
    35. $values = array();
    36. for ($i=0;$i<$for;$i++){
    37.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    38.     $value = 5;
    39.     $values[] = '['.$event_time.','.$value.']';
    40. }
    41. $res = implode(',',$values);
    42.  
    43. $stop = microtime_float();
    44. $time = number_format($stop - $start,$sign);
    45. echo "[]:          Working in $time seconds\n";
    46. unset($values);
    47. unset($res);
    48.  
    49. ###############################################################################
    50.  
    51. $start = microtime_float();
    52. $values = '';
    53. for ($i=0;$i<$for;$i++){
    54.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    55.     $value = 5;
    56.     $values[] = $event_time.','.$value;
    57. }
    58. $res = '['.implode('],[',$values).']';
    59.  
    60. $stop = microtime_float();
    61. $time = number_format($stop - $start,$sign);
    62. echo "[]2:         Working in $time seconds\n";
    63. unset($values);
    64. unset($res);
    65.  
    66. ###############################################################################
    67.  
    68. $start = microtime_float();
    69. $values = '';
    70. for ($i=0;$i<$for;$i++){
    71.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    72.     $value = 5;
    73.     $values[] = array($event_time => $value);
    74. }
    75. $res = json_encode($values);
    76.  
    77. $stop = microtime_float();
    78. $time = number_format($stop - $start,$sign);
    79. echo "JSON:        Working in $time seconds\n";
    80. unset($values);
    81. unset($res);
    82.  
    83. ###############################################################################
    84.  
    85. $start = microtime_float();
    86. $values = '';
    87. for ($i=0;$i<$for;$i++){
    88.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    89.     $value = 5;
    90.     $values .= "[$event_time,$value],";
    91. }
    92. $res = rtrim($values,',');
    93.  
    94. $stop = microtime_float();
    95. $time = number_format($stop - $start,$sign);
    96. echo "DOUBLE:      Working in $time seconds\n";
    97. unset($values);
    98. unset($res);
    99.  
    100. ###############################################################################
    101.  
    102. $start = microtime_float();
    103. $values = '';
    104. for ($i=0;$i<$for;$i++){
    105.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    106.     $value = 5;
    107.     $values .= '['.$event_time.','.$value.'],';
    108. }
    109. $res = rtrim($values,',');
    110.  
    111. $stop = microtime_float();
    112. $time = number_format($stop - $start,$sign);
    113. echo "SINGLE:      Working in $time seconds\n";
    114. unset($values);
    115. unset($res);
    116.  
    117. ###############################################################################
    118.  
    119. $start = microtime_float();
    120. $values = '';
    121. for ($i=0;$i<$for;$i++){
    122.     $event_time = strval(strtotime('2009-08-12 00:12:21'));
    123.     $value = 5;
    124.     echo '['.$event_time.','.$value.'],';
    125. }
    126.  
    127. $res = ob_get_contents();
    128.  
    129. $stop = microtime_float();
    130. $time = number_format($stop - $start,$sign);
    131. echo "OB:          Working in $time seconds\n";
    132. unset($values);
    133. unset($res);
    134.  
    135. ?>
    136.  
    Код (Text):
    1.  
    2. c:\>php cat.php
    3. COUNTER:     100000
    4. ARRAY_PUSH:  Working in 2.84897 seconds
    5. []:          Working in 2.81188 seconds
    6. []2:         Working in 2.77077 seconds
    7. JSON:        Working in 2.77757 seconds
    8. DOUBLE:      Working in 2.76440 seconds
    9. SINGLE:      Working in 2.75201 seconds
    10. OB:          Working in 2.69384 seconds
     
  10. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    а что за график на столько точек, если не секрет? посекундное изменение чего-то за трое суток?
     
  11. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    О_о

    microtime(true) // return as float
     
  12. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    что-то очень долго, у меня хмл на 10к товаров формировался за секунду

    если быстрее никак -
    а если сливать мускулом group_concat или еще как, быстрее не будет?
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну что под рукой было...
     
  14. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    дятлы ))

    PHP:
    1. <?php
    2.  $for  = 100000;
    3.   $sign = 5;
    4.  
    5.   function microtime_float()
    6.   {
    7.       list($usec, $sec) = explode(" ", microtime());
    8.       return ((float)$usec + (float)$sec);
    9.   }
    10.  
    11.   echo "COUNTER:    $for\n";
    12.  
    13.   ###############################################################################
    14.  
    15.   $start = microtime_float();
    16.   $values = array();
    17.   for ($i=0;$i<$for;$i++){
    18.       $event_time = "       ".$i%($i+1); //strval(strtotime('2009-08-12 00:12:21'));
    19.       $value = 5;
    20.       array_push($values,"[$event_time,$value]");
    21.   }
    22.   $res = implode(',',$values);
    23.  
    24.   $stop = microtime_float();
    25.   $time = number_format($stop - $start,$sign);
    26.   echo "ARRAY_PUSH:  Working in $time seconds\n";
    27.  
    28. ?>
    Казалось бы, и причем тут [Лужков] конкатенация?
     
  15. mOOx

    mOOx Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Вроде того, только за месяц :D .

    2 armadillo: эти операции оставлены специально. Там еще преобразования есть. Нужно оценить для конкретной задачи, где идет дополнительная обработка результатов запроса.

    2 440Hz: спасибо за OB. Думаю, что при больших объемах это более оптимальный вариант. У вас машинка уж очень шустрая. У меня 100000 итераций обрабатываются за 18 секунд.

    Вот, кстати, мой тест. Если руки дойдут, графики потом прикручу.
    PHP:
    1.  
    2. <?php
    3.  
    4.  $for  = (isset($_GET['cnt'])) ? $_GET['cnt'] : 10000;
    5.  $sign = 5;
    6.  
    7.  function microtime_float()
    8.  {
    9.      list($usec, $sec) = explode(" ", microtime());
    10.      return ((float)$usec + (float)$sec);
    11.  }
    12.  
    13.  ###############################################################################
    14.  
    15.  if (isset($_GET['type']) && ($_GET['type'] == 1))
    16.  {
    17.         $start = microtime_float();
    18.         $values = array();
    19.         for ($i=0;$i<$for;$i++){
    20.             $event_time = strval(strtotime('2009-08-12 00:12:21'));
    21.             $value = 5;
    22.             array_push($values,"[$event_time,$value]");
    23.         }
    24.         $res = implode(',',$values);
    25.  
    26.         $stop = microtime_float();
    27.         $time = number_format($stop - $start,$sign);
    28.         echo "COUNTER: $for; ARRAY_PUSH: $time seconds<br />";
    29.         unset($values);
    30.         unset($res);
    31.     }
    32.  
    33.  ###############################################################################
    34.  
    35.  else if (isset($_GET['type']) && ($_GET['type'] == 2))
    36.  {
    37.      $start = microtime_float();
    38.      $values = array();
    39.      for ($i=0;$i<$for;$i++){
    40.          $event_time = strval(strtotime('2009-08-12 00:12:21'));
    41.          $value = 5;
    42.          $values[] = '['.$event_time.','.$value.']';
    43.      }
    44.      $res = implode(',',$values);
    45.      
    46.      $stop = microtime_float();
    47.      $time = number_format($stop - $start,$sign);
    48.      echo "COUNTER: $for; []: $time seconds<br />";
    49.      unset($values);
    50.      unset($res);
    51.  }
    52.  
    53.  ###############################################################################
    54.  
    55.  else if (isset($_GET['type']) && ($_GET['type'] == 3))
    56.  {
    57.      $start = microtime_float();
    58.      $values = '';
    59.      for ($i=0;$i<$for;$i++){
    60.          $event_time = strval(strtotime('2009-08-12 00:12:21'));
    61.          $value = 5;
    62.          $values[] = $event_time.','.$value;
    63.      }
    64.      $res = '['.implode('],[',$values).']';
    65.      
    66.      $stop = microtime_float();
    67.      $time = number_format($stop - $start,$sign);
    68.    echo "COUNTER: $for; []2: $time seconds<br />";
    69.      unset($values);
    70.      unset($res);
    71.  }
    72.  
    73.  ###############################################################################
    74.  
    75.  else if (isset($_GET['type']) && ($_GET['type'] == 4))
    76.  {
    77.      $start = microtime_float();
    78.      $values = '';
    79.      for ($i=0;$i<$for;$i++){
    80.          $event_time = strval(strtotime('2009-08-12 00:12:21'));
    81.          $value = 5;
    82.          $values[] = array($event_time => $value);
    83.      }
    84.      $res = json_encode($values);
    85.      
    86.      $stop = microtime_float();
    87.      $time = number_format($stop - $start,$sign);
    88.    echo "COUNTER: $for; JSON: $time seconds<br />";
    89.      unset($values);
    90.      unset($res);
    91.  }
    92.  
    93.  ###############################################################################
    94.  
    95.  else if (isset($_GET['type']) && ($_GET['type'] == 5))
    96.  {
    97.      $start = microtime_float();
    98.      $values = '';
    99.      for ($i=0;$i<$for;$i++){
    100.          $event_time = strval(strtotime('2009-08-12 00:12:21'));
    101.          $value = 5;
    102.          $values .= "[$event_time,$value],";
    103.      }
    104.      $res = rtrim($values,',');
    105.      
    106.      $stop = microtime_float();
    107.      $time = number_format($stop - $start,$sign);
    108.    echo "COUNTER: $for; DOUBLE: $time seconds<br />";
    109.      unset($values);
    110.      unset($res);
    111.  }
    112.  
    113.  ###############################################################################
    114.  
    115.  else if (isset($_GET['type']) && ($_GET['type'] == 6))
    116.  {
    117.      $start = microtime_float();
    118.      $values = '';
    119.      for ($i=0;$i<$for;$i++){
    120.          $event_time = strval(strtotime('2009-08-12 00:12:21'));
    121.          $value = 5;
    122.          $values .= '['.$event_time.','.$value.'],';
    123.      }
    124.      $res = rtrim($values,',');
    125.      
    126.      $stop = microtime_float();
    127.      $time = number_format($stop - $start,$sign);
    128.    echo "COUNTER: $for; SINGLE: $time seconds<br />";
    129.      unset($values);
    130.      unset($res);
    131.  }
    132.  
    133.  ###############################################################################
    134.  
    135.  else if (isset($_GET['type']) && ($_GET['type'] == 7))
    136.  {
    137.      $start = microtime_float();
    138.      ob_start();
    139.      $values = '';
    140.      for ($i=0;$i<$for;$i++){
    141.          $event_time = strval(strtotime('2009-08-12 00:12:21'));
    142.          $value = 5;
    143.          echo '['.$event_time.','.$value.'],';
    144.      }
    145.      
    146.      $res = ob_get_contents();
    147.      ob_end_clean();
    148.      
    149.      $stop = microtime_float();
    150.      $time = number_format($stop - $start,$sign);
    151.    echo "COUNTER: $for; OB: $time seconds<br />";
    152.      unset($values);
    153.      unset($res);
    154.  }
    155.  else
    156.  {
    157. ?>
    158. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    159. <html>
    160. <head>
    161.     <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
    162.     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js" type="text/javascript" language="javascript"></script>
    163.     <script type="text/javascript" language="javascript">
    164. function start()
    165. {
    166.     for (k=10000;k<=100000;k+=10000)
    167.     {
    168.         for (i=1;i<=7;i++)
    169.         {
    170.             $.ajax({
    171.                 url: '?type='+i+'&cnt='+k,
    172.                 async: false,
    173.                 success: function(data)
    174.                 {
    175.                     $('body').append(data);
    176.                 }
    177.             });
    178.         }
    179.     }
    180. }
    181.     </script>
    182. </head>
    183. <body>
    184.     <input type="button" value="Start" onClick="start();" />
    185. </body>
    186. </html>
    187. <?php
    188.  }
    189. ?>
    190.  
     
  16. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    mOOx
    скорость конкатенации на твою задачу не влияет никак. оптимизируй вычисления
     
  17. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    +1. тесты же кажут, что разница мала, а вот при подготовке данных можно поколдовыать. посему вопросы:

    откуда беруться данные? может их там можно готовить уже сразу., т.е. при записи в базу сразу хранить JSON строку для пары.
    тогда время значительно уменьшится, т.к. не будет сборки, которая и отнимает время.
     
  18. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    так положено дядьке иметь уже такой ноут в свои 43 года.
    =)

    ты еще не видел мой 8-ми процессорный сервачек под статистику.
     
  19. mOOx

    mOOx Активный пользователь

    С нами с:
    12 авг 2009
    Сообщения:
    8
    Симпатии:
    0
    Если посмотрите на самый первый пост, то увидите, что синтаксис на конкатенацию не просто очень, а ОЧЕНЬ-ОЧЕНЬ влияет. Собственно в этом вопрос и состоял. А вот среди приведенных позже методов действительно разница не велика.

    Там очень сложный механизм синхронизации одной базы с другой (рабочей с вебом). Синхронизацией занимаюсь не я, но вообще как вариант оптимизации это можно рассмотреть. Спасибо за подсказку.
    Задачи оптимизации обработки статистики нужно обсуждать уже не в этой ветке, мне так кажется. Кстати, если есть интересная ссылка по этой теме, то буду очень благодарен, ибо заказчик уже подошел к границам, когда оптимизация необходима . :D
     
  20. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    ну тогда поподробнее и в другой ветке.
     
  21. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Онекдот.

    Для извращенцев:

    Возникла реальная задача перебора строк по 3мил символов. не спрашивайте зачем.
    PHP:
    1. <?php
    2. $n = strlen($a);
    3. for($i=0;$i<$n;$i++){
    4.     $b.=$a[$i];
    5. }
    полторы секунды.
    кстати внос strlen в условие цикла увеличивает до 2.5 сек.

    есть идеи как ускорить? )))
     
  22. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    PHP:
    1.  
    2. <?php
    3. $text = 'текстdbdfbdbdgbbdbdbddgfgggegegegerggggggggggggggljkkngselkgnselknelkwenblwelkbnbel';
    4. $start = microtime(true);
    5. $i = 0;
    6. $b = '';
    7. $n = strlen($text);
    8.  for($i=0;$i<$n;$i++){
    9.      $b.=$text[$i];
    10.  }
    11. echo microtime(true) - $start; //0.00024509429931641
    12. ?>
    PHP:
    1.  
    2. <?php
    3. $text = 'текстdbdfbdbdgbbdbdbddgfgggegegegerggggggggggggggljkkngselkgnselknelkwenblwelkbnbel';
    4. $start = microtime(true);
    5. $i = 0;
    6. $b = '';
    7. while (isset($text[$i])) {
    8.  
    9.     $b .= $text[$i];
    10.     $i++;
    11. }
    12. echo microtime(true) - $start; //0.0001530647277832
    13. ?>
     
  23. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    $a = str_repeat('a',3000); //000);
    на 3к разница есть, на 3м - нет.
    Но все равно спасибо.
     
  24. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Протестировал еще разные варианты (мой вариант, что выше, на домашнем компе - 0.00011897):

    PHP:
    1.  
    2. <?php
    3. $len = strlen($text);
    4. $b = '';
    5. while ($len--)
    6.     $b = $text[$len].$b;
    7.  
    8. //0.00011420249938965
    Этот помедленнее:
    PHP:
    1. <?php
    2. $len = strlen($text);
    3. $i = 0;
    4. $b = '';
    5. while ($i < $len) {
    6.     $b .= $text[$i];
    7.     $i++;
    8. }
    9. //0.00012612342834473
    10.  
    Вот странно, если количество символов увеличить до 3 миллионов, то получается наоборот о_О.
    Первый скрипт вообще в запой уходит, а второй показывает где-то 2.29 с.
    Самый первый предложенный вариант 2.12 с, твой вариант - 2.32
     
  25. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    while быстрее for штоле?