За последние 24 часа нас посетили 22292 программиста и 1025 роботов. Сейчас ищут 728 программистов ...

Что будет работать быстрей?

Тема в разделе "PHP для новичков", создана пользователем SLV, 14 сен 2008.

  1. SLV

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

    С нами с:
    11 авг 2008
    Сообщения:
    51
    Симпатии:
    0
    1.
    PHP:
    1. $a=file("comments_123.txt");
    2.
    PHP:
    1. $t=file_get_contents("comments_123.txt");
    2. $a=explode("\r\n", $t);
    3.прочесть файл через fgets(), затем explode()
    4.fread(), затем explode()
    5.вместо explode() использовать preg_match_all ?
     
  2. ivan_p

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

    С нами с:
    12 сен 2008
    Сообщения:
    7
    Симпатии:
    0
    Адрес:
    Красноярск
    SLV, советую тебе самому проверить, что из перечисленного тобой работает быстрее, например, с помощью функции mktime.
    Для примера возьми файл относительно большого размера (я думаю хватит 100-200 Кб) и напиши простенький сценарий, что-то вроде:
    Код (Text):
    1.  
    2. $sec_start = mktime();
    3. /* ... */
    4. $sec_end = mktime();
    5. echo "time of processing: " . ($sec_end - $sec_start);
    Вместо /* ... */ последовательно вставляй код для чтения данных из файла различными способами. Затем сравни результаты.
     
  3. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    file быстрее
     
  4. ivan_p

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

    С нами с:
    12 сен 2008
    Сообщения:
    7
    Симпатии:
    0
    Адрес:
    Красноярск
    Прошу прощения за неточность. mktime() в данном случае нежелательно использовать, т.к. она возвращает время в секундах. Лучше воспользоваться функцией microtime(). В мане есть готовый пример с ее использованием для замера времени выполнения кода.
    Первый вариант (чтение данных с помощью file()) оказался самым быстродействующим. Файл, объемом в 7 Мб у меня обрабатывался всего около 0.6 секунд.
    Тот же файл, но с использованием file_get_contents() и explode() (вариант 2) обрабатывался около 1.7 секунд.
    Дольше всего выполнялся код, использующий fgets(): около 3.5 секунд. Кстати, в этом случае использовать explode() нет необходимости.
    fread() практически полный аналог fgets().
     
  5. SLV

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

    С нами с:
    11 авг 2008
    Сообщения:
    51
    Симпатии:
    0
    спасибо за помощь, буду значит юзать file()
     
  6. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    ребят, ну что за экономия на спичках?
    при чтении достаточно большого файла любая из них будет работать медленно. К тому же ещё и от задачи зависит. А надо ли читать весь файл?

    Чисто из любви к сферическим коням.
    PHP:
    1. <?php
    2. $s1 = microtime(1);
    3. $t1 = file_get_contents('access.txt');
    4. $a1=explode('\r\n', $t1);
    5. $f1 = microtime(1);
    6.  
    7. $s2 = microtime(1);
    8. $handle = fopen('access.txt', 'r');
    9. while (!feof($handle)) {
    10.     $a2[] = fgets($handle, 4096);
    11. }
    12. fclose($handle);
    13. $f2 = microtime(1);
    14.  
    15. $s3 = microtime(1);
    16. $size=filesize('access.txt');
    17. $handle = fopen('access.txt', 'r');
    18. $t3 = fread($handle, $size);
    19. $a3=explode('\r\n', $t1);
    20. fclose($handle);
    21. $f3 = microtime(1);
    22.  
    23. $s4 = microtime(1);
    24. $a4=file('access.txt');
    25. $f4 = microtime(1);
    26. ?>
    access.txt - стандартный лог-файл, размер — 3,13 Мб
     
  7. SLV

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

    С нами с:
    11 авг 2008
    Сообщения:
    51
    Симпатии:
    0
    Luge, у вас лог-файл а у меня БД ipgeo-base весом 10 мб который мало прочесть над еще найти определенную строку, так есть ли смысл оптимизировать код?
     
  8. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    читать построчно, проверять наличие нужного, при нахождении выходить из цикла.
     
  9. SLV

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

    С нами с:
    11 авг 2008
    Сообщения:
    51
    Симпатии:
    0
    еще такая мысль можно большой файл разделить на несколько мелких, если данные отсортированы и заранее известно где искать, а потом открывать соответсвующий файл
     
  10. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    а ещё в БД залить можно ;)