摘要:這里序列化的概念可能更為廣泛和籠統一些,包括傳統的等。就目前來看,等二進制序列化無論是速度上還是數據大小上,都要比文本序列化更好。,反序列化方法。用法,序列化方法。
原文地址:https://t.ti-node.com/thread/...
數據的序列化是一個非常有用的功能,然而目測很多人跟我一樣,在剛接觸這玩意的時候壓根就不理解這貨色到底是干啥用的,反正老師說了,實在理解不了就先背過再說。
“啥犢子玩意啊,又是序列化、又是反序列化。。。”(圖片來自于《我的團長我的團》之國軍二道販子兼二人轉演員迷龍同學)。
其實將數據序列化的作用無外乎有兩個:
方便傳輸
方便存儲
方便存儲如何理解呢?比如我們有個PHP對象或者一個PHP數組需要存儲到數據庫甚至文件中,這顯然是不可能的,這個時候必須要將PHP對象或者PHP數組序列化后再執行存儲操作。不過這將PHP數組序列化后存起來還能理解,這對象也能存儲啊?這操作是否過于風騷?少年,這一點兒都不風騷。有些時候將對象直接存儲起來,用的時候只需要簡單的反序列化后就可以投產使用了,避免了new一次帶來的性能耗費。
方便傳輸如何理解呢?其實序列化在傳輸中應用的相對更多更常見些許。最簡單的一個例子,一個碼前端的碼了一個ajax找你給TA提供一個API,那么這個時候你倆得商量返回什么數據,比如json或者xml,甚至你倆自己作死約定私有數據格式。比如在一個比較典型的服務架構中,網關服務器和內部RPC服務器之間通過msgpack傳遞數據。這都是典型的序列化為了傳輸的典型應用案例。
這里序列化的概念可能更為廣泛和籠統一些,包括傳統的serialize、json、msgpack、protobuf等。( 如果你覺得序列化這個稱呼不太嚴謹的話,可以用encode來代替;反序列化則用decode來代替。反正我就用統統用序列化和反序列化來稱呼了,如果你覺得實在不舒服,可以順著網線來砍我!)。
實際上,從更高的層面看,數據的序列化可以分為兩種:
文本序列化,常見如json、serialize、xml等
二進制序列化,常見如msgpack、protobuf、thrift等
一般說來,考驗序列化技術的性能指標一共有兩個,一個是序列化的速度,一個是序列化后數據的大小,自然是序列化速度越快、序列化后的數據越小為佳。就目前來看,protobuf、msgpack等二進制序列化無論是速度上還是數據大小上,都要比文本序列化更好。不過話說回來,文本序列化有更好的可讀性,一眼就能瞪出來數據內容大概是啥玩意。
今天帶到這里的這里的有四個具體的方案,這四種方案都是簡單粗暴、開箱即用類型的,我們分別測試感受下,看哪個更適合我們。
參會的四個哥們:PHP內置的serialize、PHP內置的JSON解析器、PHP擴展JSOND、PHP擴展msgpack。其中前三個都是文本類型的,msgpack則是二進制類型的。
JSOND作為PHP內置的JSON解析器的高級版本,坊間一直傳聞速度上要比內置的更牛X一些,作為擴展,這貨需要額外安裝,附送地址:https://pecl.php.net/get/json...。
msgpack是一個鳥哥等人搞的一套二進制序列化工具,slogan就是“It"s like JSON.but fast and small.”,附送地址:https://pecl.php.net/get/msgp...
serialize用法
serialize(),序列化方法。
unserialize(),反序列化方法。
json用法
json_encode(),沒啥好說的吧?
json_decode(),沒啥好說的吧?
jsond用法
jsond_encode(),和json_encode()一樣,后面多個字母d而已。
jsond_decode(),和json_decode()一樣,后面多個字母d而已。
msgpack用法
msgpack_pack(),序列化方法。
msgpack_unpack(),反序列化方法。
測試代碼如下:
22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), "relation" => array( array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), array( "uid" => 22193123, "gender" => "famale", "username" => "elarity", "password" => md5("www123"), ), ), ) ); // 每種序列化方案都執行100000次 $counter = 100000; // json序列化方案,執行100000次 echo PHP_EOL.PHP_EOL; $start = microtime( true ); for( $i = 1; $i <= $counter; $i++ ){ $json = json_encode( $arr ); } $size = strlen( $json ); $end = microtime( true ); $cost_time = $end - $start; echo "json_encode : 耗費時間為{$cost_time} , 數據體積為{$size}".PHP_EOL; // jsond序列化方案,執行100000次 $start = microtime( true ); for( $i = 1; $i <= $counter; $i++ ){ $jsond = jsond_encode( $arr ); } $size = strlen( $jsond ); $end = microtime( true ); $cost_time = $end - $start; echo "jsond_encode : 耗費時間為{$cost_time} , 數據體積為{$size}".PHP_EOL; // serialize序列化方案,執行100000次 $start = microtime( true ); for( $i = 1; $i <= $counter; $i++ ){ $serialize = serialize( $arr ); } $size = strlen( $serialize ); $end = microtime( true ); $cost_time = $end - $start; echo "serialize : 耗費時間為{$cost_time} , 數據體積為{$size}".PHP_EOL; // msgpack序列化方案,執行100000次 $start = microtime( true ); for( $i = 1; $i <= $counter; $i++ ){ $msgpack = msgpack_pack( $arr ); } $size = strlen( $msgpack ); $end = microtime( true ); $cost_time = $end - $start; echo "msgpack耗費時間為 : {$cost_time} , 數據體積為{$size}".PHP_EOL; echo PHP_EOL.PHP_EOL;
將文件保存為test.php,然后php test.php執行,結果如下圖所示:
總結一下:
jsond確實是要比json快一些的
總有刁民張嘴就來json要比serialize()快
serialize()數據體積確實大(因為還保留了數據類型說明)
msgpack最佳???不知道昂,你們自己感受
“可以看看我的測試:https://blog.yurunsoft.com/a/...
我選擇的數據類別相對較多,有數組有對象,有小數據有較多的數據,其實固定地說哪個更好更快,沒有意義,要根據實際場景選擇合適的才好”
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/29699.html
摘要:格式支持比鍵值對復雜得多的結構化數據,這一點也很有用。例如下面這段代碼最終發送的請求是這種方案,可以方便的提交復雜的結構化數據,特別適合的接口。 簡介 form的enctype屬性為編碼方式,常用有兩種:application/x-www-form-urlencoded和multipart/form-data,默認為application/x-www-form-urlencoded。 ...
摘要:也就是閑時為了寫文章而寫的一篇關于源碼的閱讀筆記。是標準庫的縮寫,一組旨在解決標準問題的接口和類的集合。提供了一套標準的數據結構,一組遍歷對象的迭代器,一組接口,一組標準的異常,一系列用于處理文件的類,提供了一組函數,具體可以查看文檔。 也就是閑時為了寫文章而寫的一篇關于 Pimple 源碼的閱讀筆記。Pimple 代碼有兩種編碼方式,一種是以 PHP 編寫的,另一種是以 C 擴展編寫...
摘要:插入排序插入排序英語是一種簡單直觀的排序算法。插入排序在實現上,通常采用排序即只需用到的額外空間的排序,因而在從后向前掃描過程中,需要反復把已排序元素逐步向后挪位,為最新元素提供插入空間。一般來說,插入排序都采用在數組上實現。 導語 關于排序的算法,就此告一段落。冒泡排序、快速排序、選擇排序、加上本篇的插入排序,這四種算法都是相對簡單,容易理解的。更復雜的算法,就不獻丑了,以免誤人子弟...
摘要:之前,第三方編譯是管理器,是解釋器之后,官方自帶,與模式。又是解釋器,又是管理器以模塊模式運行常見配置數組排序 PHP引用變量 什么是引用變量?如何定義引用變量? 引用意味著用不同的名字訪問同一個內容定義引用變量:使用& 引用變量的工作原理 普通變量的工作原理 $a = range(0,10000); var_dump(memory_get_usage()); //int(7420...
閱讀 1585·2021-09-30 09:47
閱讀 3581·2021-09-22 15:05
閱讀 2829·2021-08-30 09:44
閱讀 3617·2019-08-30 15:55
閱讀 1365·2019-08-30 13:08
閱讀 1323·2019-08-29 16:40
閱讀 545·2019-08-29 12:45
閱讀 1380·2019-08-29 11:25