Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: странная разница в скорости

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
LIME
Отправлено: 17 Августа, 2011 - 12:03:02
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




вычитал что
PHP:
скопировать код в буфер обмена
  1. $f=fopen('CHANGES.txt','rt');
  2. $lines=explode("\n",fread($f,sizeof('CHANGES.txt')));

быстрее чем 1 ф-ция при этом еще и конец строки отрубает
решил проверить вот таким тестом
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $q=time()+microtime();
  3. for ($i=0;$i<10000;$i++) $f=file('CHANGES.txt');
  4. $w=time()+microtime();
  5. echo $w-$q.'<br>';
  6. $q=time()+microtime();
  7. for ($i=0;$i<10000;$i++) {
  8.         $f=fopen('CHANGES.txt','rt');
  9.         $lines=explode("\n",fread($f,sizeof('CHANGES.txt')));
  10. }
  11. $w=time()+microtime();
  12. echo $w-$q;
  13. ?>
результат впечатлил
38.612843036652
2.7759659290314
ерунда какая-то получается
есть комментарии?
(Добавление)
есть смысл проверить на буферизацию?
(Добавление)
дело не в буферизации
наделал 1000 копий файлов
результат тотже

(Отредактировано автором: 17 Августа, 2011 - 12:03:22)

 
 Top
EuGen Администратор
Отправлено: 17 Августа, 2011 - 12:30:18
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Думаю, понять это не так уж и сложно, если вспомнить о способах переноса строк и о том, как мы с ними работаем в обоих случаях.
Простой пример
Файл test.txt:
CODE (htmlphp):
скопировать код в буфер обмена
  1. user@host:/path$ cat test.txt
  2. 000
  3. 100
  4. 200
  5. 300
  6. 400
  7. 500
  8. 600
  9. 700
  10. 800
  11. 900

Скрипт, которым делается тест:
PHP:
скопировать код в буфер обмена
  1. function benchmark($func, $args, $times)
  2. {
  3.         $max=(int)$times;
  4.         $time_start     = microtime(true);
  5.         $mem_start      = memory_get_usage();
  6.         for($i=0; $i<$max; $i++)
  7.         {
  8.                 call_user_func_array($func, $args);
  9.         }
  10.         $time_end       = microtime(true);
  11.         $mem_end        = memory_get_usage();
  12.         return array(
  13.                 'time'  => $time_end - $time_start,
  14.                 'memory'=> $mem_end  - $mem_start
  15.         );
  16. }
  17.  
  18. var_dump(benchmark(function()
  19.         {
  20.                 $f=fopen('test.txt','rt');
  21.                 $lines=explode("\n",fread($f,sizeof('test.txt')));
  22.         },array(),$_SERVER['argv'][1]));
  23. var_dump(benchmark(function()
  24.         {
  25.                 $f=file('test.txt');
  26.         },array(),$_SERVER['argv'][1]));

Запуск и результат:
CODE (htmlphp):
скопировать код в буфер обмена
  1. user@host:/path$ php bench.php 300000
  2. array(2) {                                      
  3.   ["time"]=>                                    
  4.   float(9.9667201042175)                        
  5.   ["memory"]=>                                  
  6.   int(616)                                      
  7. }                                              
  8. array(2) {                                      
  9.   ["time"]=>                                    
  10.   float(13.309278011322)                        
  11.   ["memory"]=>                                  
  12.   int(192)                                      
  13. }

Хотя даже в этом случае разница не в 15 раз. Еще следует помнить, что t - режим, поддерживающийся только в Windows (он только там имеет смысл), преобразующий \n в \r\n


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 17 Августа, 2011 - 12:40:46
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




EuGen пишет:
Еще следует помнить, что t - режим, поддерживающийся только в Windows (он только там имеет смысл), преобразующий \n в \r\n
еще в мак
так в этом +
EuGen пишет:
Думаю, понять это не так уж и сложно, если вспомнить о способах переноса строк и о том, как мы с ними работаем в обоих случаях.
не понял
можно подробнее?
почему занимая меньше памяти file работает медленнее?
у меня получилась бОльшая разница
видимо из-за размера файла (117kB)
 
 Top
DeepVarvar Супермодератор
Отправлено: 17 Августа, 2011 - 12:42:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Таки да.
В случае с file мы начинаем seek'ать файл кусками для получения массива.
А в случае с fopen, открыв, читаем все в память и уже там разбираем - обращения к диску.
Да и для чистоты эксперимента стоит в каждой итерации делать clearstatcache();
 
 Top
LIME
Отправлено: 17 Августа, 2011 - 12:48:38
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




DeepVarvar пишет:
В случае с file мы начинаем seek'ать файл кусками для получения массива.
в смысле кусочками? )) по символу пока не встретим конец?
это объясняет конечно но это же практически недоработка file...
 
 Top
EuGen Администратор
Отправлено: 17 Августа, 2011 - 13:07:12
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




DeepVarvar пишет:
Да и для чистоты эксперимента стоит в каждой итерации делать clearstatcache();

Зачем? Результаты ни одной из используемых выше функций не кешируются.
В первом случае памяти ушло больше, так как мы еще ресурс оставляли.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
LIME
Отправлено: 17 Августа, 2011 - 13:11:46
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




ну в общем понятно
спасибо
 
 Top
PATCH
Отправлено: 18 Августа, 2011 - 08:26:43
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 924
Дата рег-ции: Апр. 2011  


Помог: 22 раз(а)




LIME пишет:
не понял
можно подробнее?
почему занимая меньше памяти file работает медленнее?
у меня получилась бОльшая разница
видимо из-за размера файла (117kB)


т.е

PHP:
скопировать код в буфер обмена
  1. $f=fopen('CHANGES.txt','rt');
  2. $lines=explode("\n",fread($f,sizeof('CHANGES.txt')));

этот пример будет быстрее при обработки файла скажем большим весом (допустим мб 8)

чем


я правильно понел?
 
 Top
LIME
Отправлено: 18 Августа, 2011 - 13:14:58
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




PATCH да
быстрее будет всегда
а чем больше файл тем больше разница в скорости
объясните в чем смысл такой реализации file()
всеравно весь файл в итоге в оперативке окажется
должен же быть смысел ))
 
 Top
White
Отправлено: 18 Августа, 2011 - 14:13:02
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




LIME пишет:
в итоге в оперативке окажется
только при использовании fopen() и друзей памяти в два раза больше будет использовано. если файл скажем 10МБ, то сначала эти 10МБ отведутся под строку хранящую содержимое файла, а потом еще 10МБ под массив со строками из файла, итого 20Мб.
в случае с file() файл будет считываться по 1байту, и последовательно заполняться массив, итого 10Мб + 1байт
PATCH у fread() есть магическое число 8192

(Отредактировано автором: 18 Августа, 2011 - 14:13:49)



-----
if(time()>1356048000) die();
 
 Top
LIME
Отправлено: 18 Августа, 2011 - 14:17:23
Post Id


Активный участник


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


Помог: 322 раз(а)




White пишет:
итого 20Мб
точно
White пишет:
есть магическое число 8192
это что такое?
 
 Top
EuGen Администратор
Отправлено: 18 Августа, 2011 - 14:25:11
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Однако не всегда 8192.
Цитата:
if the stream is read buffered and it does not represent a plain file, at most one read of up to a number of bytes equal to the chunk size (usually 8192) is made; depending on the previously buffered data, the size of the returned data may be larger than the chunk size.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
White
Отправлено: 18 Августа, 2011 - 14:36:04
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




EuGen возможно, но зачем рисковать. для таких случаев есть file_get_contents() например.
честно, не доконца уловил суть того, что они пытаются сказать. какие это данные previously buffered,
и о каком вообще потоке идет речь. если не сложно расшифруйте.


-----
if(time()>1356048000) die();
 
 Top
EuGen Администратор
Отправлено: 18 Августа, 2011 - 14:38:33
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




О любом, который можно буферизовать. Скажем, поток, который предоставляет ресурс, связанный с локальным файлом - буферизуем, а тот, что указывает на http://что-то - нет. (впрочем, теоретически себе это представить можно, но это зависит от соответствующего wrapper-а )

file_get_contents плоха, когда нужно получать информацию и что-то с ней делать при размерах файла, скажем, > 1Gb


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
White
Отправлено: 18 Августа, 2011 - 14:42:32
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




EuGen с первым понятно. насчет инфы > 1Gb даже не знаю, с такими запросами помоему лучше вообще к php не обращаться. а чем в таком случае хуже file_get_contents()?


-----
if(time()>1356048000) die();
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB