読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

JavaScriptパフォーマンスベストプラクティスその6

Nokia Developerより

クライアント-サーバー通信

XMLHttpRequestタイムアウトを設定すること

  • ブラウザはXHR requestをある時間後タイムアウトするが、スクリプトの制御下で接続を中断することが有益なことがある。これはsetTimeout()を使って XHRコールにタイムアウトを加えることによって実現可能だ。
  • Browsers will timeout XHR requests after some time, but sometimes it is beneficial to abort the connection under script control. This can be done by adding timeouts to XHR calls using setTimeout().
var xhr = new XMLHttpRequest ();
xhr.open('GET', url, false);
xhr.onreadystatechange = function () {
    if (this.readyState == 4) {                    
        clearTimeout(timeout);
        // do something with response data
    }
}
var timeout = setTimeout( 
    function () {
        xhr.abort();
        // call error callback
    },
    60*1000 // timeout after a minute
);
xhr.send();
大きなデータセットのためには、XMLJSONの代替としてカスタムデータ交換フォーマットの使用を検討すること
  • ブラウザやバージョン、OSに依って、XMLJSONのパースや横断のパフォーマンスの違いは非常に大きいかもしれない。例えば、Nokia 5800 XpressMusic上で非常に大きなデータセットを扱うと、JSONがだいたい5倍速い。
  • XMLJSONではなく、文字列ベースのカスタムのデータフォーマット(CSVを想像せよ)は転送バイトとパース時間の点から大きなデータセットでは効率的だ。
  • JavaScriptのStringやRegExpメソッドを使って、ファイルサイズのオーバーヘッドを可能な限り小さくしながら、ネイティブに実行されるJSONの速度に匹敵することができる。

Depending on the browser, its version and OS, the performance difference between XML or JSON parsing and traversing may be very significant. For example, on Nokia 5800 XpressMusic with a very large dataset JSON is approx. 5x faster.
Using a custom string-based data format (think CSV) over XML and JSON is efficient in terms of transferred bytes and parse time with large datasets.
Using JavaScript’s String and RegExp methods one can match the speed of JSON executed natively with as little overhead to the file size as possible.

JSON: {{{1}}}

カスタムデータフォーマットとStringとRegExpメソッドを使った等価なもの:

that.contacts = o.responseText.split("\\c");
 
for (var n = 0, len = that.contacts.length, contactSplit; n < len; n++) {
 
   contactSplit = that.contacts[n].split("\\a");
 
   that.contacts[n] = {};
   that.contacts[n].n = contactSplit[0];
   that.contacts[n].e = contactSplit[1];
   that.contacts[n].u = contactSplit[2];
   that.contacts[n].r = contactSplit[3];
   that.contacts[n].s = contactSplit[4];
   that.contacts[n].f = contactSplit[5];
   that.contacts[n].a = contactSplit[6];
   that.contacts[n].d = contactSplit[7];
   that.contacts[n].y = contactSplit[8];
}

ソース: