php中serialize序列化與json性能測試的示例分析_PHP教程

      編輯Tag賺U幣

      推薦:使用php get_headers 判斷URL是否有效的解決辦法
      本篇文章介紹了,使用php get_headers 判斷URL是否有效的解決辦法。需要的朋友參考下

      最近需要對大數(shù)組做存儲,需要在serialize序列化和json之間做了選擇。因此需要做了性能測試。

      php5.2之前對數(shù)組存儲的時(shí)候,大都使用serialize系列化。php5.2之后,開始內(nèi)置了 JSON 的支持

      在網(wǎng)上看到有些資料說:json_encode和json_decode比內(nèi)置的serialize和unserialize函數(shù)要高效。耳聞不如眼見,眼見不一定為實(shí)。那就用實(shí)際數(shù)據(jù)測試吧.....

      我們先理解概念:

      一、 序列化

      序列化是將對象狀態(tài)轉(zhuǎn)換為可保持或可傳輸?shù)母袷降倪^程。與序列化相對的是反序列化,它將流轉(zhuǎn)換為對象。這兩個(gè)過程結(jié)合起來,可以輕松地存儲和傳輸數(shù)據(jù)。

      將對象的狀態(tài)信息轉(zhuǎn)換為可以存儲或傳輸?shù)拇绑w的過程。 在序列化期間,對象將其當(dāng)前狀態(tài)寫入到臨時(shí)或持久性存儲區(qū)。以后,可以通過從存儲區(qū)中讀取或反序列化對象的狀態(tài),重新創(chuàng)建該對象。

      通常,對象實(shí)例的所有字段都會被序列化,這意味著數(shù)據(jù)會被表示為實(shí)例的序列化數(shù)據(jù)。這樣,能夠解釋該格式的代碼有可能能夠確定這些數(shù)據(jù)的值,而不依賴于該成員的可訪問性。類似地,反序列化從序列化的表示形式中提取數(shù)據(jù),并直接設(shè)置對象狀態(tài),這也與可訪問性規(guī)則無關(guān)。 對于任何可能包含重要的安全性數(shù)據(jù)的對象,如果可能,應(yīng)該使該對象不可序列化。如果它必須為可序列化的,請嘗試生成特定字段來保存不可序列化的重要數(shù)據(jù)。如果無法實(shí)現(xiàn)這一點(diǎn),則應(yīng)注意該數(shù)據(jù)會被公開給任何擁有序列化權(quán)限的代碼,并確保不讓任何惡意代碼獲得該權(quán)限。


      二、 JSON

      JSON,JavaScript Object Notation,一種更輕、更友好的用于接口(AJAX、REST等)數(shù)據(jù)交換的格式。 JSON是結(jié)構(gòu)化數(shù)據(jù)串行化的文本格式,作為XML的一種替代品,用于表示客戶端與服務(wù)器間數(shù)據(jù)交換有效負(fù)載的格式。它是從ECMAScript語言標(biāo)準(zhǔn)衍生而來的。JSON的設(shè)計(jì)目標(biāo)是使它成為小的、輕便的、文本的,而且是JavaScript的一個(gè)子集。JSON采用完全獨(dú)立于語言的文本格式,但是也使用了類似于C語言家族的習(xí)慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數(shù)據(jù)交換語言。易于人閱讀和編寫,同時(shí)也易于機(jī)器解析和生成。

      JSON建構(gòu)有兩種結(jié)構(gòu):
      1. “名稱/值”對的集合(A collection of name/value pairs)。不同的語言中,它被理解為對象(object),記錄(record),結(jié)構(gòu)(struct),字典(dictionary),哈希表(hash table),有鍵列表(keyed list),或者關(guān)聯(lián)數(shù)組 (associative array)。


      2.值的有序列表(An ordered list of values)。在大部分語言中,它被理解為數(shù)組(array)。

      測試:

      三、 實(shí)際測試

      PHP 5.3下執(zhí)行:我們先使用小的數(shù)據(jù)做測試:

      復(fù)制代碼 代碼如下:www.wf0088.com

      <?php
      $target = array (
      'battle_id'=> 257
      ,'user_id'=> 41248
      ,'user_id2'=> 23989
      ,'player'=> 41248
      ,'formation'=> Array
      (
      '41248'=> 1
      ,'23989'=> 2
      )

      ,'result'=> 1
      ,'battle_type'=> 1
      ,'speed'=> Array
      (
      '41248'=> 0
      ,'23989'=> 0
      )
      );

      $json = json_encode($target);
      $seri = serialize($target);

      echo "json :" , strlen($json) ,'<br/>';
      echo "serialize :", strlen($seri) ,'<br/>';

      $stime = microtime(true);
      for ($i = 0; $i < 10000; $i ++) {
      json_encode($target);
      }
      $etime = microtime(true);

      echo "json_encode :", ($etime - $stime) ,'<br/>';

      //----------------------------------

      $stime = microtime(true);
      for ($i = 0; $i < 10000; $i ++) {
      json_decode($json,true);
      }
      $etime = microtime(true);

      echo "json_decode :", ($etime - $stime),'<br/>';

      //----------------------------------
      $stime = microtime(true);
      for ($i = 0; $i < 10000; $i ++) {
      serialize($target);
      }
      $etime = microtime(true);

      echo "serialize :", ($etime - $stime) ,'<br/>';

      //----------------------------------
      $stime = microtime(true);
      for ($i = 0; $i < 10000; $i ++) {
      unserialize($seri);
      }
      $etime = microtime(true);

      echo "unserialize :", ($etime - $stime),'<br/>';

      ?>

      測試結(jié)果:

      json :156
      serialize :222
      json_encode :0.1087498664856
      json_decode :0.12652111053467
      serialize :0.041656017303467
      unserialize :0.040987968444824

      測試結(jié)果看出json效率稍微比serialize差點(diǎn),在php5.2可能會更差。應(yīng)該是在php5.3之后,json擴(kuò)展做了優(yōu)化。

      然后使用大數(shù)組做測試(代碼放到最后,因?yàn)榇a的數(shù)組比較長):

      測試結(jié)果:

      json :5350
      serialize :8590
      json_encode :0.90479207038879
      json_decode :1.753741979599
      serialize :1.3566699028015
      unserialize :1.3003630638123

      我們可以看出,serialize比json差了快一個(gè)數(shù)量級。

      總結(jié):

      1) 空間的比較

      serialize在編碼后大概是json的1.5倍

      原因:

      • serialize后字符串包含了子串的長度,這可能是速度方面的優(yōu)化,但是測試結(jié)果不盡人意
      • serialize有更加詳細(xì)的類型區(qū)分,而json只有四種類型,并且是以簡單的符號表示。
      • 2)速度的比較
      • 在較小數(shù)據(jù)的情況下, serialize比json快數(shù)量級。

        在大數(shù)據(jù)量的情況下,json比serialize稍微差一點(diǎn)

        3)處理對象
        json無法處理對象方法等數(shù)據(jù)。

        4)使用范圍

        • 序列化使用serialize,特別是對象的存儲。這是其存在的意義。
        • 與對象無關(guān)的數(shù)據(jù)存儲可以使用json,如包含大量數(shù)字的數(shù)組等。
          • 在前后端交互一般都使用JSON,另外,目前JSON只支持UTF-8編碼的數(shù)據(jù)。

      復(fù)制代碼 代碼如下:www.wf0088.com

      <?php

      $target = array (
      'battle_id'=> 257
      ,'user_id'=> 41248
      ,'user_id2'=> 23989
      ,'player'=> 41248
      ,'formation'=> Array ('41248'=> 1 ,'23989'=> 2)
      ,'result'=> 1
      ,'battle_type'=> 1
      ,'speed'=> Array( '41248'=> 0,'23989'=> 0 )
      ,'attacker'=> Array(
      '1'=> Array (
      'user_id'=> 41248
      ,'soldier_id'=> 28
      ,' ,'bid'=> 1
      ,'level'=> 1
      ,'rare'=> 1
      ,'skill_id'=> 1
      ,'totalhp'=> 3997
      ,'hp'=> 3997
      ,'attack_general'=> 346
      ,'attack_skill'=> 596
      ,'attack_explode'=> 458
      ,'attack_type'=> 1
      ,'defense'=> 0
      ,'anger'=> 50
      ,'dodge'=> 2
      ,'crit'=> 2
      ,'block'=> 2
      ,'block_effect'=> 0.5
      ,'crit_effect'=> 2
      ,'foramtion_effect'=> 0)
      ,'4'=> Array (
      'user_id'=> 41248
      ,'soldier_id'=> 29
      ,'
      prototype_id'=> 2
      ,'bid'=> 1
      ,'level'=> 1
      ,'rare'=> 1
      ,'skill_id'=> 1
      ,'totalhp'=> 3555
      ,'hp'=> 3555
      ,'attack_general'=> 396
      ,'attack_skill'=> 581
      ,'attack_explode'=> 418
      ,'attack_type'=> 1
      ,'defense'=> 0
      ,'anger'=> 50
      ,'dodge'=> 2
      ,'crit'=> 2
      ,'block'=> 0
      ,'block_effect'=> 0.5
      ,'crit_effect'=> 2
      ,'foramtion_effect'=> 0
      )
      ,'5'=> Array (
      'user_id'=> 41248
      ,'soldier_id'=> 30
      ,'prototype_id'=> 6
      ,'bid'=> 1
      ,'level'=> 1
      ,'rare'=> 1
      ,'skill_id'=> 1
      ,'totalhp'=> 3043
      ,'hp'=> 3043
      ,'attack_general'=> 351
      ,'attack_skill'=> 540
      ,'attack_explode'=> 474
      ,'attack_type'=> 1
      ,'defense'=> 0
      ,'anger'=> 50
      ,'dodge'=> 2
      ,'crit'=> 2
      ,'block'=> 0
      ,'block_effect'=> 0.5
      ,'crit_effect'=> 2
      ,'foramtion_effect'=> 0)
      ,'7'=> Array (
      'user_id'=> 41248
      ,'soldier_id'=> 37
      ,'prototype_id'=> 2
      ,'bid'=> 1
      ,'level'=> 1
      ,'rare'=> 1
      ,'skill_id'=> 1
      ,'totalhp'=> 3491
      ,'hp'=> 3491
      ,'attack_general'=> 393
      ,'attack_skill'=> 532
      ,'attack_explode'=> 456
      ,'attack_type'=> 1
      ,'defense'=> 0
      ,'anger'=> 50
      ,'dodge'=> 2
      ,'crit'=> 2
      ,'block'=> 0
      ,'block_effect'=> 0.5
      ,'crit_effect'=> 2
      ,'foramtion_effect'=> 0 ))
      ,'defender'=> Array(
      '2'=> Array(
      'user_id'=> 23989
      ,'soldier_id'=> 24
      ,'prototype_id'=> 1
      ,'bid'=> 1
      ,'level'=> 1
      ,'rare'=> 1
      ,'skill_id'=> 1
      ,'totalhp'=> 3230
      ,'hp'=> 3230
      ,'attack_general'=> 390
      ,'attack_skill'=> 567
      ,'attack_explode'=> 442
      ,'attack_type'=> 1
      ,'defense'=> 0
      ,'anger'=> 50
      ,'dodge'=> 2
      ,'crit'=> 2
      ,'block'=> 0
      ,'block_effect'=> 0.5
      ,'crit_effect'=> 2
      ,'foramtion_effect'=> 0)
      ,'5'=> Array(
      'user_id'=> 23989
      ,'soldier_id'=> 25
      ,'prototype_id'=> 2
      ,'bid'=> 1
      ,'level'=> 1
      ,'rare'=> 1
      ,'skill_id'=> 1
      ,'totalhp'=> 3400
      ,'hp'=> 3400
      ,'attack_general'=> 379
      ,'attack_skill'=> 536
      ,'attack_explode'=> 405
      ,'attack_type'=> 1
      ,'defense'=> 0
      ,'anger'=> 50
      ,'dodge'=> 2
      ,'crit'=> 2
      ,'block'=> 0
      ,'block_effect'=> 0.5
      ,'crit_effect'=> 2
      ,'foramtion_effect'=> 0 )
      ,'7'=> Array(
      'user_id'=> 23989
      ,'soldier_id'=> 26
      ,'prototype_id'=> 6
      ,'bid'=> 1
      ,'level'=> 1
      ,'rare'=> 1
      ,'skill_id'=> 1
      ,'totalhp'=> 3669
      ,'hp'=> 3669
      ,'attack_general'=> 362
      ,'attack_skill'=> 549
      ,'attack_explode'=> 426
      ,'attack_type'=> 1
      ,'defense'=> 0
      ,'anger'=> 50
      ,'dodge'=> 2
      ,'crit'=> 2
      ,'block'=> 0
      ,'block_effect'=> 0.5
      ,'crit_effect'=> 2
      ,'foramtion_effect'=> 0 )
      ,'9'=> Array(
      'user_id'=> 23989
      ,'soldier_id'=> 27
      ,'prototype_id'=> 1
      ,'bid'=> 1
      ,'level'=> 1
      ,'rare'=> 1
      ,'skill_id'=> 1
      ,'totalhp'=> 3618
      ,'hp'=> 3618
      ,'attack_general'=> 326
      ,'attack_skill'=> 510
      ,'attack_explode'=> 419
      ,'attack_type'=> 1
      ,'defense'=> 0
      ,'anger'=> 50
      ,'dodge'=> 2
      ,'crit'=> 2
      ,'block'=> 0
      ,'block_effect'=> 0.5
      ,'crit_effect'=> 2
      ,'foramtion_effect'=> 0) )
      ,'battle_process'=> Array(
      '0'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'1'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'2'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'3'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'4'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'5'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'6'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'7'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'8'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'9'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'10'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'11'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'12'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'13'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'14'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'15'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'16'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'17'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'18'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      ,'19'=> Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )

      ,'20'=>Array(
      'user_id'=> 41248
      ,'asid'=> 28
      ,'bsid'=> Array( '0'=> 26 )
      ,'harm'=> Array('0'=> 1650)
      ,'dhp'=> Array('0'=> 2019 )
      ,'attacker_anger'=> 66
      ,'defender_anger'=> Array('0'=> 94 )
      ,'skill'=> 0
      ,'state'=> 0
      )
      )

      );


      $json = json_encode($target);
      $seri = serialize($target);

      echo "json :" , strlen($json) ,'<br/>';
      echo "serialize :", strlen($seri) ,'<br/>';

      $stime = microtime(true);
      for ($i = 0; $i < 10000; $i ++) {
      json_encode($target);
      }
      $etime = microtime(true);

      echo "json_encode :", ($etime - $stime) ,'<br/>';

      //----------------------------------

      $stime = microtime(true);
      for ($i = 0; $i < 10000; $i ++) {
      json_decode($json,true);
      }
      $etime = microtime(true);

      echo "json_decode :", ($etime - $stime),'<br/>';

      //----------------------------------
      $stime = microtime(true);
      for ($i = 0; $i < 10000; $i ++) {
      serialize($target);
      }
      $etime = microtime(true);

      echo "serialize :", ($etime - $stime) ,'<br/>';

      //----------------------------------
      $stime = microtime(true);
      for ($i = 0; $i < 10000; $i ++) {
      unserialize($seri);
      }
      $etime = microtime(true);

      echo "unserialize :", ($etime - $stime),'<br/>';

      ?>

      分享:php中g(shù)et_headers函數(shù)的作用及用法的詳細(xì)介紹
      本篇文章介紹了,在php中g(shù)et_headers函數(shù)的作用及用法。需要的朋友參考下

      來源:模板無憂//所屬分類:PHP教程/更新時(shí)間:2013-04-28
      相關(guān)PHP教程