Сравнение производительности JS grid

Я использовал angular-ui-grid (http://ui-grid.info/) для отображения табличных данных . В целом это было довольно медленно, поэтому мы решили использовать ag-grid (https://www.ag-grid.com/). Это было намного более производительно, и с ним лучше работать для наборов данных обычного размера.

Однако теперь мы работаем с некоторыми табличными данными размером 100 столбцов x 10 000 строк (~ 1 млн ячеек), и сетка кажется довольно медленной в производительности.

Мне было интересно, использовал ли кто-нибудь Hypergrid (https://fin-hypergrid.github.io/core/2.0.2/) - похоже, он «решает» проблему больших столбцов x большие строки, и в их демонстрации он кажется намного быстрее (почти на порядок) на больших наборах данных.

Чем гиперсетка соотносится с ag-grid или react-virtualized в производительности на больших объемах данных?


person David542    schedule 27.08.2017    source источник
comment
Создание узлов DOM ~ 10e5? Я подозреваю, что все будет медленным.   -  person Jared Smith    schedule 28.08.2017
comment
Однако гиперсетка @JaredSmith использует холст.   -  person David542    schedule 28.08.2017
comment
Я не знаю о других, о которых вы говорите. Не использовал их. Также стоит изучить response-virtualized, поскольку он создает достаточно представлений только для заполнения видимых строк / столбцов в данный момент. Он может легко обрабатывать сотни тысяч строк и / или столбцов.   -  person bvaughn    schedule 28.08.2017
comment
Недавний выпуск v13 ag-grid включает ряд улучшений производительности - возможно, стоит взглянуть на демонстрацию прямо сейчас: ag-grid.com/example.php Сетка действительно использует виртуализацию (как строку, так и столбец), поэтому должна быть довольно быстрой   -  person Sean Landsman    schedule 28.08.2017
comment
Вертикальная прокрутка @SeanLandsman кажется приемлемой. Горизонтальная прокрутка кажется мне чертовски прерывистой, и это только с 22 столбцами. Почему горизонтальная прокрутка такая паршивая по сравнению с вертикальной прокруткой с ag-сеткой?   -  person David542    schedule 29.08.2017
comment
Я предполагаю, что они обратили внимание на вертикальный рендеринг, а не на горизонтальный. Если вы попробуете посмотреть на примере и увидеть в инструменте разработчика html elements, что они делают, то при прокрутке - они перенаправляют заголовок. Например, в ручном режиме это только изменение значений внутри элемента span.   -  person egorlitvinenko    schedule 01.09.2017
comment
@ David542 Мой ответ теперь показывает набор данных 100 000 x 200 без задержек при прокрутке. Сообщите мне, работает ли это для вас?   -  person fjoe    schedule 06.09.2017


Ответы (4)


Я не пробовал ни одной из упомянутых вами библиотек примеров, но, возможно, я смогу объяснить, почему fin-hypergrid выделяется больше всего. Мое мнение основано в первую очередь на моих знаниях JavaScript и на том, как подобные вещи работают сзади.

Наверное, стоит начать с react-virtualized и ag-grid:

  • Оба используют способ заполнения DOM и отображения только части данных в представлении, динамического удаления из DOM вещей, которые больше не видны, и предварительного добавления предстоящих вещей. Теперь проблема заключается в добавлении и удалении вещей в DOM, поскольку это, как правило, выполняется очень быстро / несколько раз в секунду. Из-за этого мы наблюдаем некоторую задержку или дрожание. Вы можете проверить Веб-консоль> Профили> Запись профилей ЦП JavaScript и увидеть, что этот метод требует времени для выполнения. Таким образом, единственное, что отличается от react-virtualized и ag-grid, - это их алгоритмы максимально плавного применения этих изменений.

ag-grid, насколько я могу судить, больше всего страдает от этой проблемы, так как вы могли видеть некоторые элементы, которые еще не завершили рендеринг, и испытывали серьезную задержку при слишком быстрой прокрутке.

react-virtualized, с другой стороны, отлично справляется со своим алгоритмом, максимально гладко реализуя его. Это может быть лучшая библиотека, доступная в категории манипуляций с DOM, хотя она все еще страдает от проблемы слишком быстрого манипулирования DOM, что приводит к задержке, хотя это наблюдается только тогда, когда задействованы большие фрагменты данных.

Вот причины, по которым fin-hypergrid выделяется:

  • Лучшим преимуществом fin-hypergrid является то, что он вообще не выполняет манипуляции с DOM, поэтому вы уже избавлены от проблемы, вызванной слишком быстрым добавлением и удалением вещей, поскольку он использует <canvas>
  • fin-hypergrid также отображает только те данные, которые видит пользователь, и динамически удаляет невидимые вещи. Он также добавляет заранее, чтобы добиться ощущения плавной прокрутки, поэтому элементы неподвижного рендеринга не отображаются.
  • fin-hypergrid также отлично справляется со своим алгоритмом прокрутки, чтобы добиться максимально плавного воспроизведения, чтобы не было дрожания или задержек.

Это не значит, что hypergrid все в порядке, у него тоже есть некоторые недостатки:

  • Поскольку fin-hypergrid создан с использованием HTML5 Canvas, его стилизация станет настоящей проблемой, поскольку он не поддерживает CSS. Вам нужно будет стилизовать его вручную.
  • Следует помнить о нескольких вещах: такие элементы управления формы, как <select>, переключатели, флажки и т. Д., Могут стать настоящей проблемой для реализации. Если вы пытаетесь реализовать что-то подобное, действуйте осторожно.
  • Он в основном используется для отображения данных с простым редактированием столбцов, не задействуя ничего, кроме текстового поля, и достижения наиболее плавного ощущения прокрутки.

В заключение, я бы, вероятно, предложил вместо этого использовать react-virtualized, поскольку он обеспечивает наиболее плавную прокрутку, чем fin-hypergrid. Если вы готовы игнорировать недостатки fin-hypergrid, то fin-hypergrid - лучший вариант.

ОБНОВЛЕНО:

Поскольку мы обсуждали JS / CSS, реализации этих таблиц на холсте. Я должен был упомянуть последнего возможного претендента, хотя это в первую очередь не библиотека таблиц js, а фреймворк, в котором можно было бы использовать Google Sheets, он называется d3.js.

  • d3.js обладает скоростью и мощью холста и в то же время сохраняет структуру HTML, это означает, что ее можно стилизовать с помощью CSS!
  • Он максимально увеличивает использование HTML 5 SVG
  • Лучше ничего не могу сказать в d3.js

Единственным недостатком d3.js в этом обсуждении является то, что:

  • Нет доступных хороших библиотек таблиц, которые используют d3.js. Google Sheets то есть. Но они не делятся кодом.
  • d3.js просто очень сложно выучить, хотя есть много вещей, которые помогают нам научиться этому быстрее, но не так быстро.

Если вам нужна скорость Canvas с возможностями стилизации CSS, тогда d3.js - это ключ, которому нужно научиться.

person masterpreenz    schedule 01.09.2017
comment
спасибо за этот ответ: как вы стилизуете canvas элементы? Не могли бы вы показать мне пример? - person David542; 02.09.2017
comment
Единственный способ стилизовать элементы в canvas - это копаться в javascript. В их примере демонстрационного файла с именем index.js: this is where hypergrid gets initialized and custom behaviors added в той части, где был инициализирован grid.behavior.dataModel.getCell, здесь вы можете изменить поведение стиля для каждой ячейки в сетке. Просто обратите внимание, что свойства CSS не применяются в холсте, единственное, что вы можете здесь достичь, это changing font, font sizes, fillColor, foreColor и другие вещи холста, которые он может предложить html5canvastutorials.com - person masterpreenz; 02.09.2017
comment
как же тогда Google Таблицы делают свой стиль? Есть ли файл javascript или что-то, что вы можете просмотреть в браузере, чтобы увидеть все стили, добавленные к листу? Как бы я на это посмотрел? - person David542; 04.09.2017
comment
Таблицы Google - это просто реализация html / javascript / css, это не холст, это почти то же самое с react-virtualized, хотя Google Таблицы усовершенствовали алгоритм, чтобы вообще не иметь всплесков задержки, и они также не делятся своим кодом, что плохо. Если вы имеете в виду файл javascript для hypergrid, который стилизует? index.js -> the line where this can be found grid.behavior.dataModel.getCell = . - person masterpreenz; 04.09.2017
comment
@ David542, хотя я забыл упомянуть еще один, который был сделан в Google Таблицах. Поскольку я упомянул реализацию HTML / CSS / JS, Canvas, есть еще один претендент, называемый (d3.js) [d3js.org/ ]. Я думаю, мне стоит просто обновить свой ответ - person masterpreenz; 04.09.2017
comment
Это может быть и то, и другое, поскольку мы не можем поместить элементы HTML на холст, div-ы ячеек действительно присутствуют same as react-virtualized готово. Я только что обнаружил, что на самом деле и то, и другое. Текст был отображен в <canvas>, а элементы - в d3.js - person masterpreenz; 05.09.2017
comment
Спасибо за обновления. Откуда вы знаете, что Google Таблицы используют d3.js? Используют ли они d3.js И холст - или d3.js ЗАМЕНЯЕТ холст? Если бы вы могли добавить немного подробностей о том, как вы это обнаружили, было бы здорово. - person David542; 06.09.2017
comment
Кроме того, при поиске в Google Sheets html (консоль разработчика) я вижу тег холста, но ничего не вижу для d3.js. Откуда вы знаете, что он этим пользуется? - person David542; 06.09.2017
comment
Фактически он не заменяет <canvas>, если вы могли проверить, что единственное, что отображается в <canvas>, было text, cells along with their, fillColor, foreColor, borders and alignments which is <canvas> all available in canvas. Остальные scrollbars / selection tool / etc. сделаны на JS. Как же тогда они делают свой стиль? Это очень сложно объяснить словами, это похоже на data = [ { x: 1, y: 2, value: "this is a cell", color: "#ccc", backgroundcolor: "#fff", font: "etc."} ], и эти данные ячейки интерпретируются сложным алгоритмом рисования в JS, который применяет это к <canvas> - person masterpreenz; 06.09.2017
comment
Вы правы, что будучи чистым холстом, Hypergrid быстрее, чем эквиваленты на основе Dom. Но вам нужно знать об огромных ограничениях, которые предлагают сетки на основе холста - многие другие способы фильтрации, сортировки, редактирования и стилизации, которые пользователи ожидают от своей сетки, в Hypergrid намного сложнее, чем в других сетках. они возможны, но сложнее, и иногда улучшение производительности в скорости, которая может вам не понадобиться, не стоит компромисса в более плохой функциональности. - person Jonny Wolfson; 21.08.2019

Я просмотрел различные варианты сетки данных. Затем я нашел это.

Надеюсь, этот ответ поможет всем, кто ищет сравнение производительности между сетками данных.

Здесь следует отметить несколько моментов, даже если вы прочитали статью, которую я предоставил.

1 - Если сетка «достаточно быстрая», что означает, что задержка рендеринга не заметна, то не имеет значения, какая сетка быстрее следующей.

2 - Сетка на основе холста не является сеткой HTML - вы не можете настроить ее с помощью HTML. Сетка будет сложно стилизовать / тематизировать / настроить стандартный разработчик JavaScript / CSS.

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

person Shashindra Sri    schedule 28.03.2019
comment
Не могу не согласиться. Мы производим Adaptable Blotter, который устанавливается поверх множества HTML5 DataGrids как на основе Canvas, так и на основе Dom. И мы неизменно обнаруживаем, что требования к производительности на самом деле не нужны в реальной жизни (поскольку в большинстве случаев у них фактически нет 250 000 строк, которые обновляются 250 раз в секунду), и что, переходя на производительность с холстом, они в конечном итоге получают худший пользовательский опыт. для того, что они на самом деле делают ежедневно - стилизация, сортировка, фильтрация, редактирование и т. д. Производительность важна, но будьте реалистичны. - person Jonny Wolfson; 21.08.2019
comment
В том-то и дело! он действительно основан на том, что вы больше всего хотите от своего приложения. Если скорость рендеринга незаметна, и вы также можете стилизовать, добавьте также объекты dom, тогда это лучшее, что я думаю, как вы сказали, реалистично. - person Shashindra Sri; 22.08.2019
comment
Ага. На самом деле ИМХО все проще. Мы проводим сотни демонстраций в год, поэтому мы видим много-много сеток и их настроек, и я бы сказал, что в 95% случаев ясно, что им нужна DOM, а не сетка холста. И на самом деле ag-Grid сейчас так далеко, как лучший HTML5 DataGrid на рынке, 95% времени, когда им нужен DataGrid на основе Dom, это ag-Grid. Я не могу вспомнить, когда в последний раз мы советовали клиенту использовать что-либо, кроме ag-Grid - его лидера рынка неспроста. - person Jonny Wolfson; 23.08.2019
comment
Да, сейчас мы тоже используем Ag-Grid. Я также реализовал fin-hypergrid ver. 3.2.0, но его слишком сложно запустить html-компоненты. С Ag-Grid у меня есть только проблема с выделением, которую нужно исправить. : D - person Shashindra Sri; 24.08.2019

Вы рассматривали возможность использования чего-то, предназначенного для больших наборов данных?

Clusterize.js

Я считаю, что это работает так, что он загружает данные только тех элементов, на которые вы смотрите. Следовательно, браузер не задерживается, потому что в нем есть элементы, необходимые для отображения области просмотра.

Демо-страница загружает 3 примера по 500 000 элементов каждый (всего 1 500 000 элементов).

Обновление - с примером фрагмента

  • Поскольку у меня нет 100 000 x 200 элементов данных для загрузки, я создаю 100 x 200, используя JavaScript.
  • Затем я копирую этот массив и вставляю его в массив данных 1000 раз.
  • Таким образом, я могу получить общий размер вашего набора данных, не перегружая движок JavaScript.
  • Поскольку трудно сказать, что он действительно выполняет 100 000 строк, я вызвал функцию getRowsAmount(), которая отображается в верхней части вывода.
  • Возможно, вам придется поиграть с размерами блоков и кластеров в зависимости от области просмотра, но это должно показать вам, что эта библиотека полностью может удовлетворить ваши потребности.

$(function() {
  var dataBlock = []
  var data = [];
  const rows = 100000
  const cols = 200;
  const blockSize = 100;
  const blocks = rows / blockSize;

  for (let i = 0; i < cols; i++) {
    $("thead tr").append(`<th>C${i}</td>`);
  }

  for (let j = 0; j < blockSize ; j++) {
    var tr = $("<tr />");
    for (var i = 0; i < cols; i++) {
      tr.append(`<td>R${j}-C${i}</td>`);
    }

    dataBlock.push($("<div />").append(tr).html());
  }

  for (let i = 0; i < blocks; i++) {
    $.merge(data, dataBlock);
  }

  var clusterize = new Clusterize({
    rows: data,
    scrollId: 'scrollArea',
    contentId: 'contentArea',
    rows_in_block: 10,
    blocks_in_cluster: 2,
  });
  
  $("#totalRows").text(clusterize.getRowsAmount());
});
table td {
  white-space: nowrap;
  padding: 0 5px;
}
<html>

<head>
  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet" />
  <link href="https://clusterize.js.org/css/clusterize.css" rel="stylesheet" />

  <script src="https://clusterize.js.org/js/clusterize.js"></script>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
</head>

<body>
  Total Rows: <span id="totalRows"></span>
  <div class="clusterize">
    <div id="scrollArea" class="clusterize-scroll">
      <table class="table">
        <thead>
          <tr></tr>
        </thead>
        <tbody id="contentArea" class="clusterize-content">
          <tr class="clusterize-no-data">
            <td>Loading data…</td>
          </tr>
        </tbody>
      </table>
    </div>
  </div>
</body>

</html>

Библиотека поддерживает добавление данных, поэтому с вашими большими наборами данных вы можете захотеть загрузить некоторые из ваших данных через AJAX.

person fjoe    schedule 03.09.2017
comment
чем это отличается от ag-grid или react-virtualized. Оба имеют плавную вертикальную прокрутку. Как насчет 200 столбцов и 100000 строк? Демонстрация двух столбцов кажется довольно тривиальной. - person David542; 04.09.2017
comment
@ David542 Я добавил пример с размером 10 000 x 50, но смог без проблем работать локально 10 000 x 200. Самая сложная часть - это создание всех данных для использования инструментом. Может быть, возьмите мой код, попробуйте свои данные и дайте нам знать? - person fjoe; 04.09.2017
comment
@ David542 Мне удалось придумать способ собрать все нужные поддельные данные и перегрузить движок JavaScript. Если вы хотите увидеть, что у меня было раньше, вы всегда можете проверить последнюю версию ответа. В этом примере теперь показаны элементы таблицы размером 100 000 x 200. - person fjoe; 04.09.2017

Я использовал бесплатную версию handsontable для больших наборов данных. См. Пример с ячейками 10000 * 100 - http://jsfiddle.net/handsoncode/Lp4qn55v/

Например, для angular 1.5:

<hot-table class="hot handsontable htRowHeaders htColumnHeaders" settings="settings"
                       row-headers="rowHeaders"  datarows="dba">
    <hot-column ng-repeat="column in Value" data="{{column.COL1}}" >
    </hot-column>
</hot-table>

См. Документацию здесь

person egorlitvinenko    schedule 01.09.2017
comment
Подобно ag-grid - вертикальная прокрутка выглядит нормально, горизонтальная прокрутка очень прерывистая. - person David542; 02.09.2017
comment
Интересно, что эффекта рывков я не вижу. - person egorlitvinenko; 04.09.2017