Forum Webscript.Ru

Программирование => PHP => Тема начата: Tronyx от 27 Июля 2002, 16:07:02

Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 27 Июля 2002, 16:07:02
Что будет быстрее Unsirialize() или Explode(), данные хранятся в файле.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: ThE0ReTiC от 27 Июля 2002, 16:23:49
Tronyx
Кто сильнее - кит или слон?
Смотри:
array explode(string separator, string string [, int limit)
Returns an array of strings, each of which is a substring of string formed by splitting it on boundaries formed by the string separator. If limit is set, the returned array will contain a maximum of limit elements with the last element containing the rest of string.

unserialize() takes a single serialized variable (see serialize()) and converts it back into a PHP value. The converted value is returned, and can be an integer, float, string, array or object.

Перевести?

И еще почитай про Serialize() и implode().

ИМХО сравнение некорректно немного...

Что приметять зависит от того, какого типа данные храняться в файле.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 27 Июля 2002, 17:07:40
Цитировать
Перевести?

Да. :)

Цитировать
ИМХО сравнение некорректно немного...

Да. Извини не корректно вопрос задал. Расшифровываю: как быстрее будет "добраться" до данных из файла? Хранить их в сериализованом виде или элементы разделять например "|", а потом explode`ом их разбивать.

Цитировать
ИМХО сравнение некорректно немного...

Что приметять зависит от того, какого типа данные храняться в файле

Задача: достать из файла (< 1 Kb) 2-3 массива с 3-4 элементами.

Если использовать explode:

$file=file("file.txt");
for ($i=0; $i    $array[$i]=explode("|", $file[$i]);    
}

Unserialize:

$file=file("file.txt");
$file=join("", $file);
Unserialize($file);
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: GotZfild от 27 Июля 2002, 17:58:01
По моим тестам
explode - 0.0036240
unserialzie - 0.0021610
Только прежде чем производить unserialzie, нужно сначала сериализовать данные, что тоже отнимет время.
Хотя наверняка это время сильно зависит от размеров массива.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: ThE0ReTiC от 27 Июля 2002, 18:01:59
Цитировать
Задача: достать из файла (< 1 Kb) 2-3 массива с 3-4 элементами.

Explode однозначно...
GotZfild
прав
Цитировать
нужно сначала сериализовать данные

Лишняя операция.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 27 Июля 2002, 19:20:31
Цитировать
нужно сначала сериализовать данные

Это не беда. Новые данные будут писаться очень редко
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: ThE0ReTiC от 27 Июля 2002, 19:47:03
Tronyx
Т огда сам решай :)
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 27 Июля 2002, 21:26:36
Насколько я понимаю, сериализованные данные занимают больше одной строки.
А вообще вопрос, на мой взгляд, из серии бесполезных.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 27 Июля 2002, 23:14:20
RomikChef
а вот мне кажется, что именно твой ответ и бесполезен. Прочитай сначала вопрос, а потом свой ответ.


Tronyx
в зависимости от типов данных - будет разная скорость. Лично я предпочитаю сериалайз, так как в таком случае ты не ограничиваешься на типе хранимых данных.
Представь например, как ты будешь хранить многомерный массив - т.е. сколько операций придется выполнить для его записи, чтения.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 27 Июля 2002, 23:45:39
Stek
А я предпочитаю не доводить до того, чтобы приходилось хранить массивы.
Всегда можно обойтись без них, и это будет совместимо и удобно.

Про бесполезность я поясню.
Во-первых, совсем нетрудно потестить самому.
Во-вторых, я готов спорить, у него на сайте есть куда более животрепещущие проблемы и куда более серьезные дыры в производительности.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 28 Июля 2002, 02:05:54
RomikChef
Может и так, но все таки не стоит на вопрос, при том нормальный, отвечать в духе "ну и фигню вы товарищ тут спрашиваете".
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 28 Июля 2002, 11:21:09
Stek
Если ты не понял моих слов, то это твоя проблема.
Я сказал, что это бесполезный вопрос. Это не тот вопрос, которому надо придавать такое уж внимание.

Но, пожалуй, я возьму свои слова обратно.
Тут действительно не было сказано о размере массива.
Если кто-то хочет хранить в сериализованном виде ленту новостей, то это дурная идея. Лучше разориться на 5 баксов и взять нормальный хостинг с базой данных.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 28 Июля 2002, 13:26:17
Цитировать
Если кто-то хочет хранить в сериализованном виде ленту новостей, то это дурная идея. Лучше разориться на 5 баксов и взять нормальный хостинг с базой данных.

Во первых кто тебе сказал что у меня нет БД?! А во вторых это не лента новостей.

Я пишу скрипт который достаёт из БД контент (в зависимоти от URL, так как файл и папки виртуальные (прочти мою тему "виртуальные файлы и папки" там подробней рассказано)), затем вставляет его в шаблон. У каждой папки есть своё название, Title формируется путём "склеивания" этих названий, + для дюбой папки можно указать шаблон который будут наследовать все вложеные, использоваться будет самый последний шаблон.

И чтобы сэкономить на скорости (сделать меньше запросов к БД) я использую кеширование этой информации - сохраняю в файл массив названий папок, используемый шаблон и т.д. для конкретного URL (один URL - один файл). Если использовать explode это выглядет так:

заголовок1|заголовок2|...|заголовокN
Шаблон
ещё какой-нибудь параметр

Цитировать
Тут действительно не было сказано о размере массива.

Правда что ли! А это что такое?
> Задача: достать из файла (< 1 Kb) 2-3 массива с 3-4 элементами.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 28 Июля 2002, 13:30:49
Я думаю, накладные расходы на работу с твоим "кэшем" равны скорости работы с базой. Ты вообще замерял?
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 28 Июля 2002, 17:09:02
Цитировать
Ты вообще замерял?

Нет, но при большой посещаемости и большой базе, думаю лучше для этого "кеша" использовать файлы.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 28 Июля 2002, 17:11:42
А я думаю, что с базой будет удобнее.
Меньше сущностей - меньше глюков, меньше проблем.
Все равно ты контент достаешь из базы - ну и кто тебе мешает путь доставать?

А с файлами заморачиваться... Блокировки ставить, clearstatcache... оно тебе надо?

А при большой посещаемости надо не тайтлы кэшировать, а весь контент - статику генерить.
Не знаю, вот не очень я понимаю твоего вопроса. У меня столько дел на сайте - запросы оптимизировать, новые фичи добавлять... На такие, как твой просто времени не остается. Если сайт начинает тормозить - профилируем его, выделяем узкие места, и начинаем их выпрямлять.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 28 Июля 2002, 19:10:19
Цитировать
Все равно ты контент достаешь из базы - ну и кто тебе мешает путь доставать?

Это ещё один запрос, а если новое поле в таблице с контентом создавать, то геморно будет переносить файлы из одной папки в другую, переименовывать...

Цитировать
А с файлами заморачиваться... Блокировки ставить, clearstatcache... оно тебе надо?

Пути это один из возможных видов кеширования, конечно же есть возможность кешировать весь контент.

Цитировать
У меня столько дел на сайте - запросы оптимизировать, новые фичи добавлять...

Так я тоже это делаю! С запросами уже вроде не плохо вот решил занятся "малым" и пинаю до совершенства.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 28 Июля 2002, 23:53:33
Цитировать
А с файлами заморачиваться... Блокировки ставить, clearstatcache... оно тебе надо?

Проблемму то нашел :) Я себе для этого класс написал - и больше не вспоминаю.
А на сложном сайте кеширование сильно облегчает работу сервера.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 29 Июля 2002, 00:57:46
Stek
Я понимаю кэширование ВСЕЙ страницы. Перевод в статику.
Я понимаю оптимизацию запросов.
Но кэшировать заголовок страницы при том, что весь контент берется из базы - я этого не понимаю.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 29 Июля 2002, 09:06:23
Цитировать
Я понимаю кэширование ВСЕЙ страницы. Перевод в статику.

Я же сказал что это есть, на выбор даётся 4 варианта:
1. Кеширование абсолютно всей страницы.
2. Кеширование контента, затем он будет вставлен в дизайн.
3. Кеширование путей. Повторяю это убирает 1 запрос к БД и обработку результата (сравнительно большая), что тоже не плохо.
4. Не кешировать вообще.

Цитировать
при том, что весь контент берется из базы - я этого не понимаю.

Так ведь таблицы разные. В одной контент а в другой дерево папок. Чтобы достать инфу о загаловке, шаблоне... нужно сделать один запрос который достанет папки с нужными именами, затем нужно проверять вложеность этих папок (ведь может быть папка с таким же именем, но находящаяся в другой), и чтобы это каждый раз не делать я кеширую. Конечно же если включено кеширование контента то кешировать пути не нужно. Это довольно таки неплохой способ при минимуме затрат(нужно мало дополнительного места на диске).

Теперь понял?

P.S. В каком-то смысле это и есть оптимизация запросов :)
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 29 Июля 2002, 20:39:46
А как вставлять статичный документ? С помощью require() или file() ( echo join("", file("cash.html")); ). ИМХО если я не ошибаюсь то file(); "схавает" больше памяти.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 29 Июля 2002, 21:04:40
readfile()
только статичные документы не "вставляют", а просто кладут в каталог веб-сервера и ставят на них ссылки.
Представь себе, есть такой способ представления данных.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 29 Июля 2002, 22:15:32
Цитировать
только статичные документы не "вставляют", а просто кладут в каталог веб-сервера и ставят на них ссылки.
Представь себе, есть такой способ представления данных.

А ты почитай повнимательней предыдушие сообщения там сказано, что файлы и папки виртуальные и создавать их я небуду, а все закешированые страницы кидаются в отдельную папку.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 29 Июля 2002, 22:27:05
Гы.
Дак я что. Я ничего.
Нехай будут в отдельной папке.
просто когда я буду переводиться на статику, это у меня займет в 10 раз меньше кода, будет работать быстрее и без ошибок :-)))
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 29 Июля 2002, 22:40:34
В принципе-то я понимаю, что у тебя система управления контентом, и все такое.

Просто лично мне все эти вещи не нравятся.
уж больно они усложняют систему и через какое-то время ее становится чертовски трудно поддерживать...
Я никогда не изменяю принципу KISS :)
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 30 Июля 2002, 10:17:29
Цитировать

Гы.
Дак я что. Я ничего.
Нехай будут в отдельной папке.
просто когда я буду переводиться на статику, это у меня займет в 10 раз меньше кода, будет работать быстрее и без ошибок :-)))

Сорри. Это я протормазил. ;) до меня самого это чуть позже дошло, а как сделать чтобы была полная статика ещё не совсем дошло :( Вот какие варианты приходят в голову:
1. Как-то через mod_rewrite узнать существует ли файл кеша и если да то переписать УРЛ на кеш, если нет то на скрипт. (но вроде это не реально).
2. Передавать на скрипт все запросы на .html файлы если файл кеша есть, а это будет такой же путь только файл - .htm делать Header(Location: ...);
3. Делать такое же дерево папок и файлов(не виртуальных) и не вы*быв@ться. (ИМХО ты вроде за этот вариант)

Если есть ещё какие-нибудь плиз подскажи.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Меняздесьдавнонет от 30 Июля 2002, 10:35:26
Я думаю, второй - самый реальный.

А вообще для себя я буду делать так.
Кэш не автоматический ,а ручной.
анализируются самые посещаемые страницы.
Для них генерится статика.
А у тебя в базе, может, признак придумать какой-то, что эту страницу выдавать не из базы, а давать прямой линк.

Постой. А если так?
мод-реврайт направляет тебя на htm файл. Если его нету, то тогда уже обработчик 404 выдвет из базы?
Не, ккриво как-то...
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 30 Июля 2002, 10:50:45
Цитировать
Сорри. Это я протормазил.  до меня самого это чуть позже дошло, а как сделать чтобы была полная статика ещё не совсем дошло  Вот какие варианты приходят в голову:
1. Как-то через mod_rewrite узнать существует ли файл кеша и если да то переписать УРЛ на кеш, если нет то на скрипт. (но вроде это не реально).
2. Передавать на скрипт все запросы на .html файлы если файл кеша есть, а это будет такой же путь только файл - .htm делать Header(Location: ...);


Посмотри вот это
http://www.phpdevs.com/data/24/
Исходники есть,  внутри - сплошная динамика, снаружи - уже как статика. Кеширование так же присутствует :)
В качестве обучающего примера - думаю сойдет :)
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 30 Июля 2002, 13:42:21
Цитировать
Я думаю, второй - самый реальный.

Но это опять же дерево папок нужно строить :( это я забыл. А вот если этот вариант немного улучшить:
Всё запросы на .html файлы "отправляются" на скрипт, затем он проверяет есть ли этот документ в кеше (а имя закешированого документа это путь, только все "/" заменяются на точку и расширение файла .htm, чтобы не зациклился), если есть то делает хедер локейшен на этот файл только вместо точек ставится "/", затем запускается mod_rewrite и переписывает этот путь на /cash/путь.с.точками.htm. Может это геморно?

Цитировать
Постой. А если так?
мод-реврайт направляет тебя на htm файл. Если его нету, то тогда уже обработчик 404 выдвет из базы?
Не, ккриво как-то...

Да мне это тоже в голову приходило, удобно, НО если кешировать довольно таки мало странц, будет лишняя нагрузка на сервер, смотри:
1. mod_rewrite переписывает УРЛ.
2. Apache ищет файл.
3. Apache даёт сигнал на ошибку.
4. Запускает новый процес на PHP.
5. Скрипт генерирует страницу.
Конечно если кешируется бОльшая часть страниц или даже все, просто кеша этой страницы ещё нет, то это ИМХО лучший вариант.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 30 Июля 2002, 13:54:53
Tronyx
Блин, ну посмотри ты iCMS - я там эту проблему уже месяца четыре назад решил :)
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 30 Июля 2002, 15:18:07
CMS не плохая, но не доделаная и практически не имеет гибкости, тем не менее не плохая :) Админ интерфейс прикольный, мне очень понравилась навигация, в своей так же сделаю ;) На счёт кеширования там ИМХО глухо, а именно: делается файл в дириктории /cash, с именем закодированым с помощью md5() (что кодируется я толком не понял, не до этого), а потом (теперь самое интересное) данные из кеша достаются вот так:

unserialize(base64_decode(implode("", file($this->cach_dir."/".$dir.$file))));

Так что мой вариант кеширования (с инклудом) ещё не самый плохой ;)
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 30 Июля 2002, 15:20:08
Stek так это твоя! Блин ну я тормаз ;) Ну а твоё решение ИМХО тормозней моего.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 30 Июля 2002, 16:32:25
Цитировать
и практически не имеет гибкости

По заказу строю на iCMS сайты любой констукции :)

По поводу кеша - это мой стандартный модуль кеширования.  Его громозкость кода обусловленна тем, что, он предназначен не только для кеширования страниц, но и для кеширования массивов, объектов, элементов страниц и прочего.

Таким образом, если в странице меню делается сложными выборками и расчетами - мне достаточно сделать предварительные обработки, а готовый к употреблению объект записать в кеш, и потом уже его использовать .


Естественно, если необходимо кеширование только страниц - то все это можно сильно упростить, тем более с учетом того что iCMS построенна в основном на объектах.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 30 Июля 2002, 17:18:21
Цитировать
По заказу строю на iCMS сайты любой констукции

А вдруг клиент тебе в последствии не сможет найти? Конечно это очень маловероятно, но всёже гибкость нужна!

Цитировать

Таким образом, если в странице меню делается сложными выборками и расчетами - мне достаточно сделать предварительные обработки, а готовый к употреблению объект записать в кеш, и потом уже его использовать.

Обычно это делается в шаблонизаторе. Или напиши разные функции.

Цитировать

Естественно, если необходимо кеширование только страниц - то все это можно сильно упростить

Это ты без проблем упростишь, а если заказчик купит только скрипт, а настройку и обслуживание не закажет? или в последствии захочет что-то изменить то прийдётся "рыться" в коде. Да и вообще что бы изменить способ кеширования лезть в код программы ИМХО очень не удобно.

З.Ы. И лучше напиши свой собственный шаблонизатор, который будет кешировать меню и т.д., а от FastTemplate тебе лучше отказаться его писали ещё для PHP3, уж очень он медленный.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 30 Июля 2002, 19:21:15
Цитировать
А вдруг клиент тебе в последствии не сможет найти

И что ? Ты можешь привести пример сайто конструктора, где без программиста можно сделать сайт отличный от шаблона ?

Цитировать
Обычно это делается в шаблонизаторе

ты сможешь в шаблонизаторе кешировать объекты, массивы ? Кеш и шаблоны - совершенно разные вещи.

Цитировать
Это ты без проблем упростишь, а если заказчик купит только скрипт, а настройку и обслуживание не закажет

Скрипт бесплатный, и он во многом уступает другим скриптам. Деньги берутся не за скрипт, а за поддержку, за создание на нем сайтов.

Цитировать
З.Ы. И лучше напиши свой собственный шаблонизатор, который будет кешировать меню и т.д., а от FastTemplate тебе лучше отказаться его писали ещё для PHP3, уж очень он медленный.


IP II 600 / 256Ram с включенным кешированием держит порядка 300,000 реальных посетителей. Далее просто траффика для проверки не хватило.

Когда будут доставать проблеммы со скоростью, тогда и буду менять.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 30 Июля 2002, 19:51:44
Цитировать
ты сможешь в шаблонизаторе кешировать объекты, массивы ? Кеш и шаблоны - совершенно разные вещи

А зачем тебе при создании кеша страницы кешировать объекты и массивы? ИМХО это совершенно не нужно.

Цитировать
Скрипт бесплатный, и он во многом уступает другим скриптам. Деньги берутся не за скрипт, а за поддержку, за создание на нем сайтов.

У тебя на сайте написано, возможно, что следующии версии будут за деньги, или ты хочешь переписывать его каждый раз, когда необходимо изменить какое-нибудь действие? А под заказчиком здесь можешь также понимать "простых" людей которые будут пользоваться твоей CMS бесплатно. Ведь не у всех такие же требования к CMS как у тебя.

Цитировать
Когда будут доставать проблеммы со скоростью, тогда и буду менять.

Но ведь это не правильно, лучше предусмотреть всё заранее, а тем более такую "мелочь".
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 30 Июля 2002, 23:23:10
Цитировать
А зачем тебе при создании кеша страницы кешировать объекты и массивы?

Ну как тебе сказать, некоторым заказчикам требуется больше чем просто меню с ссылками :D


Цитировать
У тебя на сайте написано, возможно, что следующии версии будут за деньги

И что ? Если я дойду таки до версии за деньги, то с моей стороны там будет полный саппорт.  
В конце концов, цель любого продукта, так или иначе способствовать добыванию денег.

А по поводу скорости - то достаточно включить кеширование, чтобы забыть  о всех проблеммах с темплейтами.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 31 Июля 2002, 00:02:31
Цитировать
Ну как тебе сказать, некоторым заказчикам требуется больше чем просто меню с ссылками

А что они требуют?

Цитировать
А по поводу скорости - то достаточно включить кеширование, чтобы забыть о всех проблеммах с темплейтами.

А если места на диске мало? Кеш негде хранить? ИМХО лучше нормальный, быстрый шаблонизатор.

Цитировать
И что ? Если я дойду таки до версии за деньги, то с моей стороны там будет полный саппорт.
В конце концов, цель любого продукта, так или иначе способствовать добыванию денег.

И для каждого клиента ты будешь переписывать скрипт?
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 31 Июля 2002, 00:20:59
Цитировать
А если места на диске мало? Кеш негде хранить?


Издеваешся ? Теперь дисковое пространство копейки стоит. Даже для проекта стоимостью около 500 баксов, каждый месяц платить по 10 баксов за хостинг никогда проблем не составляет.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Antoxa от 02 Августа 2002, 02:21:31
насчет кеширования страниц есть предложение посмотреть mod_accel _в_дополнение_ ко всему вышеизложенному
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Stek от 02 Августа 2002, 11:37:43
Antoxa
Уже не первый раз слышу о это модуле, кто то в разы у себя нагрузку снимал, по крайней мере из их утверждений.

Единственное но тут, как правило в таких вещах все зависит от хостера, и не всегда его можно уговорить на постановку дополнительного модуля.

Хотя с той же стороны, сайты с большой нагрузкой снимают свои сервера, и тут проблем в постановке своего софта нет.
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Tronyx от 02 Августа 2002, 12:39:04
Цитировать
Издеваешся ?

Нет. Просто сглупил :)

Цитировать
mod_accel

А что он именно делает?
Название: Unsirialize() vs. Explode(), что быстрее?
Отправлено: Antoxa от 02 Августа 2002, 12:41:57
кеширует ответы сервера, повторяю. ответы.
читать тут: http://sysoev.ru/mod_accel/