2012/04/04

JavaScriptオブジェクト⇔JSON文字列の変換処理時間

JavaScriptオブジェクトをJSON文字列にシリアライズ、 逆にJSON文字列からJSONオブジェクトにデシリアライズするのにかかる時間の計測結果。 オブジェクトのネストはなく、型はStringのみで、かつ一回の集計のみと、 まともな計測データの体はなしていない。 Webサービスを作るときに、やり取りするJSONのサイズにかかる ブラウザの計算量負荷を考えるにあたって、大雑把にスケールをつかんでみようかという目的で計測。

環境

  • OS: Windows7 64bit
  • CPU: Core i5 650 (3.2 [GHz])
  • RAM: 12 [GB]
  • Chrome: 17.0.963.83 m
  • IE8(64bit): 8.0.7601.17514
  • jQuery: 1.7.2.min
  • jQuery.json: 2.3.min

動作

  1. Stringの配列を作成する。配列の長さは m であり、それぞれ n 文字のアルファベットからなる文字列がセットされている、
  2. 1.で作成したStringの配列をJSON文字列に変換する。JSON.stringify or jQuery.toJSONメソッドを用いる。
  3. 2.で作成したJSON文字列を、JavaScript文字列に変換する。JSON.parse or jQuery.parseJSONメソッドを用いる。
上記の3, 4の時間を計測する。 変数の値域は下記のとおり。
  • n = 1, 2, 3, ... 10
  • m = 20, 21, 22, ..., 219

結果

各シートの記述内容
  • Chrome: 17.0.963.83 m(JSON) JSON.parse, JSON.stringifyを使用
  • Chrome: 17.0.963.83 m(jQuery)  $.parseJSON, $.toJSONを使用
  • IE8_64:8.0.7601.17514(jQuery)  $.parseJSON, $.toJSONを使用
IEが思ったより時間かかりすぎて、グラフを起こす気力がない。 10文字程度のID文字列を複数件やり取りするとして、 レスポンスを5秒以下に抑えようとすると、 IEだと4万件以下、Chromeだと27,8万件以下に抑えないとまず無理なのかもしれんなー。 まぁそんだけの量をHTTPで一度に送受信ってのもちょっと考えづらいか。

テストコード


$(function(){
        function TestCondition(recordLength, recordNumber){
            this.isCalculated = false;
            this.recordLength = recordLength;
            this.recordNumber = recordNumber;
            this.spentTime = {
                constructJsObject: 0,
                serialize: 0,
                deserialize: 0
            };
        }

        TestCondition.prototype = {
            execute: function(){
                var recordString = "";
                for(var i=0; i<this.recordLength; i++){
                    recordString += "X";
                }

                var rawJsObject = {};

                var startTime = new Date();
                for(var i=0; i<this.recordNumber; i++){
                    rawJsObject[i] = new String(recordString);
                }
                this.spentTime.constructJsObject = new Date() - startTime;

                startTime = new Date();
                var serialized = $.toJSON(rawJsObject, null)
                this.spentTime.serialize = new Date() - startTime;

                startTime = new Date();
                var deserialized = $.parseJSON(serialized);
                var deserialize = new Date() - startTime;
                this.spentTime.deserialize = new Date() - startTime;

                this.isCalculated = true;
            },

            writeResult: function(){
                var resultTable = $('#resultTable');
                var resultRecord = $('<tr></tr>');
                resultRecord.append('<td>' + this.recordLength + '</td>');
                resultRecord.append('<td>' + this.recordNumber + '</td>');
                resultRecord.append('<td>' + this.spentTime.constructJsObject + '</td>');
                resultRecord.append('<td>' + this.spentTime.serialize + '</td>');
                resultRecord.append('<td>' + this.spentTime.deserialize + '</td>');
                resultTable.append(resultRecord);
            }
        };

        for(var i=1; i<11; i++){
            for(var j=0; j<20; j++){
                var test = new TestCondition(i, Math.pow(2, j));
                test.execute();
                test.writeResult();
            }
        }

   });

JSON文字列変換後の文字長ぐらい、計算出しておけばよかった。

0 件のコメント:

コメントを投稿