Pull to refresh

Сравнение производительности браузеров при обработке JSON-строк

JavaScript *
Translation
Original author: gOODiDEA
imageМы парсим JSON-строку в JSON-объект, когда обрабатываем AJAX-ответы сервера. Обычно, для парсинга JSON-строки мы используем eval или new Function, однако IE8 и Firefox3.1 имеют встроенную поддержку JSON (встроенный парсинг работает значительно быстрее). Как определить на практике выбор между этими тремя методами? И как узнать чья производительность быстрее среди такого большого количества браузеров?

Примечание переводчика: здесь представлен частичный адаптированный перевод, в связи с тем, что в оригинале были проведено обновление, которое я привел как основной результат.

Код и условия


Определим json-строку:
var count = 10000, o = null, i = 0, jsonString = '{"value":{"items": [{"x":1,"y":2,"z":3}, {"x":1,"y":2,"z":3}, {"x":1,"y":2,"z":3}, {"x":1,"y":2,"z":3}, {"x":1,"y":2,"z":3}]},"error":null}';

* This source code was highlighted with Source Code Highlighter.


Парсинг json-строки и запись результатов:

eval

var beginTime = new Date();
for ( i = 0; i < count; i++ ) {
  o = eval( "(" + jsonString + ")" );
}
Console.output( "eval:" + ( new Date() - beginTime ) );


* This source code was highlighted with Source Code Highlighter.


new Function

var beginTime = new Date();
for ( i = 0; i < count; i++ ) {
  o = new Function( "return " + jsonString )();
}
Console.output( "new Function:" + ( new Date() - beginTime ) );


* This source code was highlighted with Source Code Highlighter.


native

if ( typeof JSON !== "undefined" ) {
  var beginTime = new Date();
  for ( i = 0; i < count; i++ ) {
    o = JSON.parse( jsonString );   }
  Console.output( "native:" + ( new Date() - beginTime ) );
} else {
  Console.output( "native:not support!" );
}


* This source code was highlighted with Source Code Highlighter.


wrapper

var __json = null;

if ( typeof JSON !== "undefined" ) {
  __json = JSON;
}
var browser = Browser;
var JSON = {
  parse: function( text ) {
    if ( __json !== null ) {
      return __json.parse( text );
    }
    if ( browser.gecko ) {
      return new Function( "return " + text )();
    }
    return eval( "(" + text + ")" )
  }
};     

var beginTime = new Date();
for ( i = 0; i < count; i++ ) {
  o = JSON.parse( jsonString ); }
Console.output( "wrapper:" + ( new Date() - beginTime ) );


* This source code was highlighted with Source Code Highlighter.

Браузеры


IE6, 7, 8; Firefox2, 3, 3.1; Chrome; Opera and Safari3, 4.

Тестовая система


T9300 CPU + 4G RAM + Windows2003, IE8 in Vista, IE7 на другой машине( 2G CPU + 2G RAM + Windows2003 )

Результаты тестирования




Progg it
Tags:
Hubs:
Total votes 43: ↑40 and ↓3 +37
Views 1.4K
Comments Comments 31