За последние 24 часа нас посетили 17763 программиста и 1714 роботов. Сейчас ищут 998 программистов ...

Еще немного о производительности

Тема в разделе "Прочие вопросы по PHP", создана пользователем AlexGousev, 20 апр 2007.

  1. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Задача лексического разбора исходного текста привела меня к необходимости следующего сравнения:

    PHP:
    1. <?php
    2. function is_white_space($char) {
    3.     return in_array($char, array(' ', "\r", "\n", "\t"));
    4. }
    5.  
    6.  
    7. class white_space {
    8.     function is_white_space($char) {
    9.         return in_array($char, array(' ', "\r", "\n", "\t"));
    10.     }
    11. }
    12.  
    13. $char = "\n";
    14.  
    15. $time = microtime(true);
    16.     for ($k=0; $k<100000; $k++) {
    17.         is_white_space($char);
    18.     }
    19. echo '<p>Function: '.(microtime(true)-$time).'</p>';
    20.  
    21. $wsc = new white_space;
    22. $time = microtime(true);
    23.     for ($k=0; $k<100000; $k++) {
    24.         $wsc->is_white_space($char);
    25.     }
    26. echo '<p>Method: '.(microtime(true)-$time).'</p>';
    27.  
    28. $time = microtime(true);
    29.     for ($k=0; $k<100000; $k++) {
    30.         in_array($char, array(' ', "\r", "\n", "\t"));
    31.     }
    32. echo '<p>In_array: '.(microtime(true)-$time).'</p>';
    33.  
    34.  
    35. $time = microtime(true);
    36.     for ($k=0; $k<100000; $k++) {
    37.         if ($char == ' ' || $char == "\r" || $char == "\n" || $char == "\t");
    38.     }
    39. echo '<p>Simple: '.(microtime(true)-$time).'</p>';
    40.  
    41. $time = microtime(true);
    42.     for ($k=0; $k<100000; $k++);
    43. echo '<p>Empty cycle: '.(microtime(true)-$time).'</p>';
    44.  
    45.  
    46. ?>
    Результаты (довольно стабильны):
    Код (Text):
    1.  
    2. Function: 0.75935792922974
    3. Method: 1.2185189723969
    4. In_array: 0.50226283073425
    5. Simple: 0.14355111122131
    6. Empty cycle: 0.035768985748291
    Все это, конечно, относится к случаю большого количества вызовов функций/методов (количество итераций - 100 тысяч). Т.е. для пары десятков вызовов все это не будет иметь никакого значения.
     
  2. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    PHP:
    1. <?
    2. class white_space {
    3.     private $a = array(' ', "\r", "\n", "\t");
    4.     function is_white_space($char) {
    5.         return in_array($char, $this->a);
    6.     }
    7. }
    быстрее функции
     
  3. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1. <?php
    2. function is_white_space($char) {
    3.     return in_array($char, array(' ', "\r", "\n", "\t"));
    4. }
    5.  
    6. class white_space {
    7.     function is_white_space($char) {
    8.         return in_array($char, array(' ', "\r", "\n", "\t"));
    9.     }
    10. }
    11.  
    12. class white_space_by_Ti {
    13.     private $a = array(' ', "\r", "\n", "\t");
    14.     function is_white_space($char) {
    15.         return in_array($char, $this->a);
    16.     }
    17. }
    18.  
    19. $char = "\n";
    20.  
    21. $time = microtime(true);
    22. for ($k=0; $k<100000; $k++) {
    23.     is_white_space($char);
    24. }
    25. echo '<p>Function: '.(microtime(true)-$time).'</p>';
    26.  
    27. $wsc = new white_space;
    28. $time = microtime(true);
    29. for ($k=0; $k<100000; $k++) {
    30.     $wsc->is_white_space($char);
    31. }
    32. echo '<p>Method: '.(microtime(true)-$time).'</p>';
    33.  
    34. $time = microtime(true);
    35. for ($k=0; $k<100000; $k++) {
    36.     in_array($char, array(' ', "\r", "\n", "\t"));
    37. }
    38. echo '<p>In_array: '.(microtime(true)-$time).'</p>';
    39.  
    40.  
    41. $time = microtime(true);
    42. for ($k=0; $k<100000; $k++) {
    43.     if ($char == ' ' || $char == "\r" || $char == "\n" || $char == "\t");
    44. }
    45. echo '<p>Simple: '.(microtime(true)-$time).'</p>';
    46.  
    47. $time = microtime(true);
    48. for ($k=0; $k<100000; $k++);
    49. echo '<p>Empty cycle: '.(microtime(true)-$time).'</p>';
    50.  
    51. $ti = new white_space_by_Ti;
    52. $time = microtime(true);
    53. for ($k=0; $k<100000; $k++) {
    54.     $ti->is_white_space($char);
    55. }
    56. echo '<p>Ti\'s method: '.(microtime(true)-$time).'</p>';
    57.  
    58. /* Спасибо, Ti! Натолкнул меня на мысль, хотя оно все-равно медленне самого простого способа,
    59.    но уже лучше для настраиваемых списков */
    60. $time = microtime(true);
    61. $white_spaces = array(' ', "\r", "\n", "\t");
    62. for ($k=0; $k<100000; $k++) {
    63.     in_array($char, $GLOBALS['white_spaces']);
    64. }
    65. echo '<p>Global array method: '.(microtime(true)-$time).'</p>';
    66.  
    67. ?>
    Код (Text):
    1.  
    2. Function: 0.6974151134491
    3. Method: 1.0876939296722
    4. In_array: 0.50457882881165
    5. Simple: 0.14894986152649
    6. Empty cycle: 0.033971071243286
    7. Ti's method: 0.62794184684753
    8. Global array method: 0.27099394798279
     
  4. Anonymous

    Anonymous Guest

    AlexGousev, спасибо, крайне интересно!
     
  5. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Горбунов Олег
    Издеваешься? :)
     
  6. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    PHP:
    1.  
    2. <?
    3. function is_white_space_by_Ti($char) {
    4.     static $a = array(' ', "\r", "\n", "\t");
    5.     return in_array($char, $a);
    6. }
    :D
     
  7. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ti
    Совсем плохой... [​IMG]
     
  8. Ti

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

    С нами с:
    3 июл 2006
    Сообщения:
    2.378
    Симпатии:
    1
    Адрес:
    d1.ru, Екатеринбург
    Ти плохой или способ?

    Function: 0.729779958725
    Function Ti: 0.583673000336
     
  9. Anonymous

    Anonymous Guest

    AlexGousev, абсолютно серьезно.
     
  10. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Это я про себя ;)
     
  11. vb

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

    С нами с:
    6 июн 2006
    Сообщения:
    911
    Симпатии:
    0
    Адрес:
    Saint-Petersburg
    AlexGousev, Ti +1