Pull to refresh

Comments 39

ну разница мизерная, +(un)serialize встроенная ф-я,.. так что на этом тоже думаю не стоит заморачиваться =)
JSON функции также встроены в PHP начиная с версии 5.2.0. Но разница действительно мизерная.
спасибо, было интересно почитать. Лично я предпочитаю JSON так как удобней хранить данные и можно сразу в AJAX выдавать.
Итог: serialize/unserialize быстрее всегда.

как так? у вас же на диаграмме serialize медленнее, чем json_encode.
Имелись в виду парные операции - т.е. кодирование сравнивалось с кодированием, декодирование - с декодированием.
ну, и я о том же: на диаграмме serialize медленне, чем json_encode, но unserialize быстрее, чем json_decode. почему ж тогда «serialize/unserialize быстрее всегда»? unserizlize быстрее всегда, да. а serialize, наоборот, медленнее всегда, получается.
Упс... Конечно же вы правы. Исправляю топик.
Вы не использовали русский UTF-8 у нас JSON почему-то каждый не латинский символ кодировал в четырех сивольный код, так что размер как раз раздувался нереально
так правильно, яваскрипт получил escape последовательность.
ну насколько я знаю - у JS нет проблем с юникодом, в таком случае зачем искейпить русские символы?
это вы спросите у своего броузера
причем тут мой браузер? когда это продукт php-функций?
вы про какие символы спрашиваете? %uXXXили \uXXX в пхп?
http://pastie.org/242412 - вот все классно работает, в чем проблема то?
ооо, сэкономлю еще 0.001 секунды. спасибо, мой сайт будет летать.
микрооптимизация это потеря времени
Всё зависит от масштабов. Если это часто выполняемая операция, я думаю не будет лишним потратить час на тесты.
Микрооптимизации должны сидеть в подкорке и делаться автоматически.
Руки сами не должны писать for (i = 0; i < count(array); i++).
Насчёт пост-инкремента согласен, но если этот цикл работает не очень много времени я всегда напишу i < count(array) чем перед циклом array_size = count(array) и i < array_size, потому что экономия несущесвенна, а читабельность и время страдает.
А я как раз с вами и согласен, Я пытался сказать, что у человека, профессионально пишущего код решение вопроса надо ли писать i < count(array) или count = count(array); i < count не должно занимать больше 0,001 секунды. :) И не в коем случае не являться предметом обсуждения.
Я с вами полностью согласен. Я хотел сказать, что у человека, пишущего код профессионально, решение вопроса надо ли писать i < count(array) или array_size = count(array); i < array_size не должно занимать больше 0,001 секунды и ни в коем случае не являться предметом жаркой дискуссии.
жаль что тема уже не обсуждается…

по поводу for (i = 0; i < count(array); i++) — мы как-то заинтересовались этим вопросом, решили проверить. вообще-то спор был, как джава и пхп это обрабатывают. в джаве, ясное дело, каждый раз вычисляться значение count, если массив не меняется, не будет. самое интересное — в пхп тоже не вычисляется каждый раз. скорее всего оптимизация интерпретатор…

возможно, опубликую данные теста
С точки зрения логики count — обычная функция, которая принимает параметром массив, а поэтому не совсем понятно почему она не должна исполняться каждый раз при вызове. Хотя я не претендую на знания приемов оптимизации PHP-интерпретатора.
потому я и написал «самое интересное». неожиданный приятный сюрприз ;)
У меня на других тестовых данных получилось что json_encode занимает в 3 раза меньше времени чем serialize. Выигрыш у json по компактности данных раза в 2.

Также для себя посчитал плюсом что json легко читается и позволяет искать что-либо в сжатом поле SQL запросом через LIKE, иногда приходится такое делать.
Действительно, если в указанном примере вместо цифр и латинских символов использовать UTF-8 кириллицу, то json_encode быстрее в три раза. Спасибо за замечание, дополню топик.
На самом деле на таких маленьких цифрах не очень показательно... Запустили бы хоть на 1000 раундов... Ну или на 100 раундов и по 10К элементов...
Вижу, что вы не забыли использовать исключительно одинарные кавычки и echo вместо print’а. Это хорошо. Продолжайте в том же духе.
Это тенденция большинства популярных языков программирования — к их «облегчению», этим грешат все, но мало кто из создателей говорит об этом (а если точнее никто), не будете же вы признавать, что новые возможности имеют недостатки.
Для новичков это оправдано, и база изучающих язык ввиду его «лёгкости» возростает, да и потом — как правило, новички не станут делать что-то громоздкое, т.е. в большинстве своём различия не так уж заметны.
Давно интересуюсь этим вопросом. Подкину пару мыслей:

1. Эксперимент был бы интереснее, и результаты сильнее бы отличались в те или иные стороны, если бы данные были разной длины и разного размера. Попробуйте сериализовать/десериализовать: очень короткие строки, очень длинные строки (главы из книг), целые числа и вещественные числа, массивы, и так далее.

2. Реализация serialize/unserialize в PHP имеет ряд особенностей (и мне это не очень нравится). К примеру, попробуйте сериализовать текст, содержащий перевод строки, а потом посмотрите, как выглядит уже сериализованная строка. То есть, используя serialize(), нельзя рассчитывать гарантированно получить однострочную строку, например, для передачи скрипту параметров методом GET. Поэтому часто после serialize() приходится использовать дополнительные функции для кодирования полученного результата, например base64 или url encode.
Прошу прощения, опечатка. В первом пункте имелось в виду: если бы данные были разного типа* (строки, числа, массивы), и разного размера.
Спасибо за проделанную работу.

list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
я обычно заменяю на microtime(true) для наглядности ;), как не странно многие не знают о такой возможности

Ещё интересный факт:

class MyTest extends StdClass{
protected $test = 24;
public function test(){
echo $this->test, PHP_EOL;
}
}

$a = new MyTest();
$a->test1 = 'string';

$b = unserialize( serialize($a));
var_dump($b);
$b->test();

$c = json_decode(json_encode($a));
var_dump($c);
$c->test();
/*/ // вывод скрипта
object(MyTest)#2 (2) {
["test:protected"]=>
int(24)
["test1"]=>
string(6) "string"
}
24
object(stdClass)#3 (1) {
["test1"]=>
string(6) "string"
}

Fatal error: Call to undefined method stdClass::test() in /home/kandy/workspace/TelmeWeb/Telme/test.php on line 31

Call Stack:
0.0003 96944 1. {main}() /home/kandy/workspace/TelmeWeb/Telme/test.php:0
/**/


Вывод прост: json предназначен для другого
Замечательная пометка про microtime(true), очень показательный пример с классом. Блеск.
В "спеке" по JSON'у говориться только об упаковке свойств объекта.
Про упаковку методов - ни слова.
я не совсем понимаю зачем вообще упаковывать методы
В том то и дело что незачем.
UFO just landed and posted this here
Для полноты картины сравните с XML и Bencode.

Bencode - это формат, обеспечивающий максимально возможную скорость десериализации за счет отсутствия накладных расходов на парсинг и определение типов значений. Используется для кодирования torrent файлов.
Реализаций на PHP хватает. Например: http://www.pear.php.net/package/File_Bittorrent2/
UFO just landed and posted this here
Sign up to leave a comment.

Articles

Change theme settings