シリアル化解除機能のパフォーマンス

PHPには、シリアライズとアンシリアライズの2つの優れた機能があります。 1つ目は実質的にすべてのデータセットを文字列に変換し、2つ目は逆変換を実行します。 これらの関数は、キャッシュを整理したり、データベースにセッションを保存したりするときに便利です。 unserialize関数が予想外に長く実行される可能性があることがわかりました。



大量のデータをシリアライズおよびデシリアライズする方法と理由については説明しませんが、見つけたものを見るのはもっと面白いです。

  1. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  2. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  3. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  4. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  5. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  6. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  7. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  8. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  9. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  10. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  11. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  12. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;



  13. <?php ini_set ( 'memory_limit' , '512M' ) ; $file = '/tmp/1' ; $data = range ( 1 , 2000000 ) ; echo "Test serialize \n " ; $time0 = microtime ( 1 ) ; file_put_contents ( $file , serialize ( $data ) ) ; $time1 = microtime ( 1 ) ; unserialize ( file_get_contents ( $file ) ) ; $time2 = microtime ( 1 ) ; $timeset = $time1 - $time0 ; $timeget = $time2 - $time1 ; echo "Serialize set time $timeset get time $timeget \n " ;





 シリアル化のテスト
設定時間のシリアル化1.35619807243取得時間31.1126699448




デシリアライズに30秒! この結果は私に衝撃を与えました。 まず、file_get_contentsが実行結果に影響しないことを確認しました。 次に、json_encodeとjson_decodeのパフォーマンスを調べました(JSONは時間0.270335912704を取得して時間1.30652809143を取得します)。 「すべてが奇妙で奇妙です」と思い、非直列化関数の動作時間の非直列化された配列の長さに対する依存性のグラフを作成することにしました。







グラフは、配列の長さに対する関数の実行時間の2次(!)依存性を明確に示しています。 以下に、このような予想外に遅い組み込みの非直列化関数を示します。



もちろん、状況は重要ではありません。 シリアル化および逆シリアル化の他の方法を使用できます。 この記事の主な目的は、非シリアル化関数のパフォーマンスがデータのサイズにどのように依存するかを示すことです。



結果を確認するためのソースコードは、 http://alexxz.ru/habr/unserialize_benchmark.tar.gzにあります。



使用されているソフトウェアとハ​​ードウェアPHP 5.3.2

Linux ubuntu 2.6.32-24-generic(10.4)

Intel®Core 2 CPU 6600 @ 2.40GHz



______________________

テキストは©SoftCoder.ruによってブログエディターで作成されます。



All Articles