Какой самый быстрый анализатор JSON для JavaScript? - PullRequest
2 голосов
/ 18 января 2010

Я хочу показать список с 1000 строками, используя Json, который поддерживается Struts2, например, pug-in.Я использую flexigrid (jquery) для анализа 1000 строк для отображения.Но это так медленно, и иногда мой браузер падает.(Firefox & IE).

Итак, какая самая быстрая среда Javascript для анализа около 1000 строк?

Ответы [ 5 ]

15 голосов
/ 18 января 2010

Какой самый быстрый анализатор JSON для JavaScript?

eval или, когда доступно, собственный анализатор JSON, по крайней мере, в Chrome, Safari, Firefox 3.something, Opera 10.50 и даже IE8 (только в режиме IE8)

5 голосов
/ 18 января 2010

Покажите пользователю, что он хочет видеть.

Показать 50 строк, добавить фильтр или поиск.

Если вы действительно думаете, что данные должны быть доступны на одной странице, возможно, вам нужно извлечь данные, пока пользователь выполняет прокрутку (и, таким образом, собирать меньшие порции за раз).

2 голосов
/ 18 января 2010

Я не думаю, что вы получите приемлемую производительность практически от любого компонента сетки, показывающего 1000 одновременно , особенно в IE (даже в IE8). Но большинство сеток должно поддерживать 1000 единиц памяти (ну, в зависимости от их размера) и отображать в них окно (скажем, 20 строк, 40 строк и т. Д.) С опциями подкачки и фильтрации без значительной производительности. проблема. Я думаю, это будет лучше для пользователей.

Редактировать

Мне стало любопытно проверить, и да, время анализа JSON не является проблемой; это будет рендеринг. Ниже приведен пример очень, очень простой (не производственной) подкачки, полностью на стороне клиента. На моем нетбуке IE7 анализирует 1000 строк простых объектов JSON за 36 мс, поэтому даже сложные объекты не должны быть проблемой. Это использует Прототип evalJSON, который (даже сейчас) просто откладывает до eval и помещает данные в круглые скобки (они изменят это).

1000rows.html

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
<title>1,000 Row Test Page</title>
<style type='text/css'>
body {
    font-family: sans-serif;
}
#log p {
    margin:     0;
    padding:    0;
}
</style>
<script type='text/javascript' src='http://ajax.googleapis.com/ajax/libs/prototype/1.6.1.0/prototype.js'></script>
<script type='text/javascript' src='1000rows.js'></script>
</head>
<body><div>
<input type='button' id='btnLoadData' value='Load Data'>
<input type='button' id='btnNext' value='Next'>
<input type='button' id='btnPrevious' value='Previous'>
<table>
<thead>
<tr><th>Name</th><th>Description</th><th>Count</th></tr>
</thead>
<tfoot>
<tr><th colspan='3' id='theLabel'></th></tr>
</tfoot>
<tbody id='theData'>
<tr><td colspan='3'></td></tr>
</tbody>
</table>
<hr>
<div id='log'></div>
</div></body>
</html>

1000rows.js (с использованием Prototype; jQuery будет другим, но похожим)

(function() {
    var data, windowTop, WINDOW_SIZE;

    // "Constant" for the size of our window into the data
    WINDOW_SIZE = 20;   // Rows

    // No data yet
    clearData();

    // Hook up our observers when we can
    document.observe('dom:loaded', function() {
        $('btnLoadData').observe('click', loadData);
        $('btnNext').observe('click', function(event) {
            event.stop();
            updateWindow(WINDOW_SIZE);
        });
        $('btnPrevious').observe('click', function(event) {
            event.stop();
            updateWindow(-WINDOW_SIZE);
        });
    });

    // Clear our data to a known state
    function clearData() {
        data = [];
        windowTop = 0;
    }

    // Click handler for the load data button
    function loadData() {
        var success;

        log("Loading data..");
        clearData();
        updateWindow();
        success = false;

        // Note: Using text/plain rather than application/json so
        // Prototype doesn't parse the data for me, so I can measure
        // how long it takes to do it.
        new Ajax.Request("data.txt", {
            onSuccess: function(response) {
                var start, duration;

                success = true;
                log("Got data, parsing");
                start = new Date().getTime();
                data = response.responseText.evalJSON();
                duration = new Date().getTime() - start;
                log("Data parsed in " + duration + "ms");
                updateWindow.defer();
            }
        });
    }

    function updateWindow(offset) {
        var dataElement, labelElement, markup, index, template;

        // Get the target element
        dataElement = $('theData');
        labelElement = $('theLabel');
        if (!dataElement || !labelElement) {
            return;
        }

        // If no data, simply say that
        if (!data || data.length <= 0) {
            dataElement.update("");
            labelElement.update("No information");
            return;
        }

        // Ensure that windowTop is rational
        if (WINDOW_SIZE > data.length) {
            windowTop = 0;
        }
        else {
            if (typeof offset == 'number') {
                windowTop += offset;
            }
            if (windowTop + WINDOW_SIZE > data.length) {
                windowTop = data.length - WINDOW_SIZE;
            }
            if (windowTop < 0) {
                windowTop = 0;
            }
        }

        template = new Template(
            "<tr><td>#{name}</td><td>#{description}</td><td>#{count}</td></tr>"
        );

        markup = "";
        index = windowTop + WINDOW_SIZE - 1;
        if (index >= data.length) {
            index = data.length - 1;
        }
        $('theLabel').update('Showing rows ' + windowTop + ' through ' + index);
        while (index >= windowTop) {
            markup = template.evaluate(data[index]) + markup;
            --index;
        }

        dataElement.update(markup);
    }

    // Log a message
    function log(msg) {
        $('log').appendChild(new Element('p').update(msg));
    }
})();

data.txt (конечно, довольно скучно)

[
    {"name": "Name #0001", "description": "Description #0001", "count": 1},
    {"name": "Name #0002", "description": "Description #0002", "count": 2},
    {"name": "Name #0003", "description": "Description #0003", "count": 3},
    ...
    {"name": "Name #1000", "description": "Description #1000", "count": 1000}
]

... полную копию data.txt можно найти здесь .

1 голос
/ 18 января 2010

1000 строк что ?JQuery на самом деле довольно быстрый, особенно после обновления производительности в версии 1.4 (выпущенной всего несколько дней назад).Если у вас возникают проблемы с отображением 1000 строк, я сначала спросил бы, почему вы показываете так много - ни одному человеку не нужно было бы так много прокручивать.И, во-вторых, важна ли вся информация, и вы только передаете важную информацию в значение JSON.И, наконец, вы излишне усложняете DOM своим способом добавления данных?

Опять же, если вы запрашиваете только то, что вам нужно , чтобы показать, и выотображая разумных данных (размещение 1000 строк на экране нецелесообразно), jQuery будет более чем достаточно для ваших нужд.

0 голосов
/ 18 января 2010

Если вам действительно нужна скорость, функция javascript eval("..."); самая быстрая. К сожалению, это небезопасно, поскольку может выполнять вредоносный JavaScript.

Существует также Javascript JSON Parser (найден здесь ) с JSON.org. Они написали javascript для анализа строк JSON для создания объекта JSON (я слышал, что отладка с использованием Firebug, надстройки Firefox, создает массив объектов JSON, но я никогда не пробовал).

...