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 :: странная разница в скорости
результат впечатлил
38.612843036652
2.7759659290314
ерунда какая-то получается
есть комментарии? (Добавление)
есть смысл проверить на буферизацию? (Добавление)
дело не в буферизации
наделал 1000 копий файлов
результат тотже
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
Думаю, понять это не так уж и сложно, если вспомнить о способах переноса строк и о том, как мы с ними работаем в обоих случаях.
Простой пример
Файл test.txt:
Хотя даже в этом случае разница не в 15 раз. Еще следует помнить, что t - режим, поддерживающийся только в Windows (он только там имеет смысл), преобразующий \n в \r\n
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
LIME
Отправлено: 17 Августа, 2011 - 12:40:46
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
EuGen пишет:
Еще следует помнить, что t - режим, поддерживающийся только в Windows (он только там имеет смысл), преобразующий \n в \r\n
еще в мак
так в этом +
EuGen пишет:
Думаю, понять это не так уж и сложно, если вспомнить о способах переноса строк и о том, как мы с ними работаем в обоих случаях.
не понял
можно подробнее?
почему занимая меньше памяти file работает медленнее?
у меня получилась бОльшая разница
видимо из-за размера файла (117kB)
DeepVarvar
Отправлено: 17 Августа, 2011 - 12:42:28
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
Таки да.
В случае с file мы начинаем seek'ать файл кусками для получения массива.
А в случае с fopen, открыв, читаем все в память и уже там разбираем - обращения к диску.
Да и для чистоты эксперимента стоит в каждой итерации делать clearstatcache();
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
PATCH да
быстрее будет всегда
а чем больше файл тем больше разница в скорости
объясните в чем смысл такой реализации file()
всеравно весь файл в итоге в оперативке окажется
должен же быть смысел ))
White
Отправлено: 18 Августа, 2011 - 14:13:02
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
LIME пишет:
в итоге в оперативке окажется
только при использовании fopen() и друзей памяти в два раза больше будет использовано. если файл скажем 10МБ, то сначала эти 10МБ отведутся под строку хранящую содержимое файла, а потом еще 10МБ под массив со строками из файла, итого 20Мб.
в случае с file() файл будет считываться по 1байту, и последовательно заполняться массив, итого 10Мб + 1байт PATCH у fread() есть магическое число 8192
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
White пишет:
итого 20Мб
точно
White пишет:
есть магическое число 8192
это что такое?
EuGen
Отправлено: 18 Августа, 2011 - 14:25:11
Профессионал
Покинул форум
Сообщений всего: 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.
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
White
Отправлено: 18 Августа, 2011 - 14:36:04
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
EuGen возможно, но зачем рисковать. для таких случаев есть file_get_contents() например.
честно, не доконца уловил суть того, что они пытаются сказать. какие это данные previously buffered,
и о каком вообще потоке идет речь. если не сложно расшифруйте.
----- if(time()>1356048000) die();
EuGen
Отправлено: 18 Августа, 2011 - 14:38:33
Профессионал
Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007 Откуда: Berlin
Помог: 707 раз(а)
О любом, который можно буферизовать. Скажем, поток, который предоставляет ресурс, связанный с локальным файлом - буферизуем, а тот, что указывает на http://что-то - нет. (впрочем, теоретически себе это представить можно, но это зависит от соответствующего wrapper-а )
file_get_contents плоха, когда нужно получать информацию и что-то с ней делать при размерах файла, скажем, > 1Gb
----- Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
White
Отправлено: 18 Августа, 2011 - 14:42:32
Частый посетитель
Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011 Откуда: Днепропетровск
Помог: 28 раз(а)
EuGen с первым понятно. насчет инфы > 1Gb даже не знаю, с такими запросами помоему лучше вообще к php не обращаться. а чем в таком случае хуже file_get_contents()?
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.