AG-Grid 大数据集渲染时间(慢)

2024-03-09

我有一个网格,其中包含大量但合理的数据(大约 12,000 个单元格... 340 列和 34 行)。我知道这看起来像是一个横向表格,但对于我们的应用程序来说,它更可能有大量的列和更少的行。

当数据约为 2300 个单元格(68 列和 34 行)时,速度足够快,我可以称之为“立即”。没什么我担心的。

将其增加 5 倍会导致初始渲染时间呈指数增长。具体来说,列的创建需要很长时间,在recursivelyCreateColumns method.

达到 10 倍会导致需要几分钟才能完成。到了 20 点,它没有崩溃,但 5 分钟后它仍然在运行,我怀疑这将需要一个小时或更长时间。

我的问题是,即使我为 AG-Grid 创建网格列/行/数据以处理的代码在 20ms 范围内运行,我可以做些什么来使 AG-Grid 更轻松地创建列吗?也许它只在必要时创建列?

我的网格设置如下:

var gridOptions = {
    enableCellExpressions: true,
    columnDefs: data.header,
    rowData: data.body.data,
    floatingTopRowData: data.body.floatingTopData,
    rowHeight: 25,
    headerHeight: 25,
    enableColResize: true,
    enableSorting: true,
    enableFilter: true,
    getNodeChildDetails: function(rowItem) {
        if(rowItem.items) {
            return {
                expanded: scope.gridOptions.rowData[0].something === rowItem.something,
                group: true,
                field: "something",
                key: rowItem.something,
                children: rowItem.items
            };
        }
        return null;
    }
};

Check ag-grid 性能文档 https://www.ag-grid.com/documentation/javascript/scrolling-performance/

我把它复制在这里以便快速访问:

表现

ag-Grid 速度很快。然而,ag-Grid 也可以通过多种方式进行配置和扩展。

人们经常来到 ag-Grid 论坛并询问“为什么我的应用程序中的网格没有那么快?”。

本页介绍了如何使网格运行得更快。

1. 设定期望ag-Grid 的速度可以与演示应用程序 Demo Application 中演示的一样快。您可以通过调整浏览器的大小来将演示应用程序的大小调整为与应用程序中的网格相同的大小,然后在网格中导航(滚动、过滤等),并查看演示网格与您自己的实现相比的速度有多快。如果演示网格运行得更快,那么性能还有改进的空间。

2. 检查单元格渲染器ag-Grid 可以通过自定义单元格渲染器减慢速度。要测试这一点,请从网格中删除所有单元格渲染器并再次比较速度。如果网格确实通过删除单元格渲染器提高了速度,请尝试一一引入单元格渲染器,以找出哪些单元格渲染器增加的开销最大。

3. 创建快速单元渲染器最快的单元格渲染器具有以下属性:

网格渲染是高度定制的,纯 JavaScript 单元格渲染器将比等效框架运行得更快。使用 ag-Grid 的框架版本(例如用于设置 ag-Grid 属性等)仍然可以,但是因为创建和销毁的单元格太多,框架添加的附加层对性能没有帮助。如果您有性能问题,则应考虑纯 JavaScript 单元格渲染器。

并不是每个人都需要极快的单元格渲染器(例如,也许您的用户使用具有快速浏览器的快速机器,或者您的网格可能只有很少的列),在这种情况下,框架单元格渲染器可能工作得很好。仅当您希望提高性能时,不使用单元框架的建议才适用。

使用单元渲染器框架可能会比较慢,因为会创建和销毁大量单元。大多数时候,单元格中不会有复杂的功能,因此使用纯 JavaScript 应该不成问题。对于所有其他组件(过滤器、编辑器等),使用框架不会产生太大的差异,因为这些组件的创建和销毁不像单元渲染器那样频繁。

4.关闭动画行和列动画可带来出色的用户体验。然而,并非所有浏览器都像其他浏览器一样擅长动画。考虑检查客户端的浏览器并关闭速度较慢的浏览器的行和列动画。

5. 配置行缓冲区rowBuffer 属性设置网格在可视区域之外呈现的行数。默认值为 10。例如,如果您的网格显示 50 行(因为这是屏幕上不滚动的所有内容),则网格实际上总共会渲染 70 行(上面额外 10 行,下面额外 10 行)。然后,当您滚动时,网格将已经有 10 行准备好等待显示,因此用户将不会看到重绘(并非所有浏览器都显示重绘,只有较慢的浏览器)。

设置低行缓冲区将使网格的初始绘制更快(例如,当首次加载数据时,或在过滤、分组等之后)。设置高的行缓冲区将减少可见垂直滚动的重绘。

6.使用Chrome网格在 Google Chrome 上运行速度最快。如果可以的话,请告诉您的用户。

7.了解数据更新对于快速变化的数据,请考虑使用批量更新事务,它允许网格进行大量更新,而不会使浏览器变得缓慢。 JavaScript Datagrids 中的流式更新博客也对此进行了演示,该博客显示每秒数十万次更新。

8.另请参阅阅读文章8性能黑客对于 JavaScript,这样你就知道网格在做什么,这样你就能够用它进行推理。

9. 去抖动垂直滚动默认情况下,垂直滚动没有去抖动。然而,在慢速浏览器上,尤其是 IE,根据您的应用程序,您可能希望消除垂直滚动的抖动。

要消除垂直滚动的抖动,请设置网格属性 debounceVerticalScrollbar=true。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AG-Grid 大数据集渲染时间(慢) 的相关文章

随机推荐

  • 使用代理协议时可以设置X-Real-IP吗?

    我的设置如下 负载均衡器 nginx Traefik 到位的负载平衡器确实not支持代理协议 相反 它将客户端的真实 IP 添加到 TCP 选项字段 哎呀 我知道 Details https github com Huawei TCP op
  • 当我使用 XAMPP 服务器时 MySQL 将无法运行

    这是我在 XAMPP 上运行 MySQL 时的错误日志 我不知道如何修复它 它总是卡在尝试启动 MySQL 服务上 我尝试更改端口 但结果仍然相同 也尝试过重新安装但是问题还是一样 提前谢谢你 我得到的错误如下 2015 11 10 15
  • JFreeChart:如何将Y轴从左侧移动到右侧?

    I use JFreeChart to create a candlestick chart The horizontal axis is a DateAxis to indicate the time the vertical axis
  • 打印替换表达式而不进行数值计算

    是否可以打印替代 SymPy 表达式而不进行计算 我想打印替换的表达和结果 e g x Symbol x expr x 2 pprint expr this prints expression result expr subs x 2 pr
  • HttpWebRequest 在 SQLCLR 中第一次运行缓慢

    在 CLR 存储过程中发出 HttpWebRequest 时 按照下面的代码 Sql Server 重新 启动后或在给定 但不确定 的时间段后的第一次调用会在 Sql Server 上等待相当长的时间 GetResponse 方法调用 有没
  • React Native - 在 AppNavigator 之外访问抽屉导航

    App js
  • Xcode 4 中身份检查器下的标签颜色

    在身份检查器下 我们都知道标签属性用于在界面生成器中更容易地识别对象 但是它底部的颜色是用来做什么的 我尝试选择一种颜色 但界面生成器中没有任何变化 编辑 截图 如果您还没有使用颜色标签来对文件和文件夹进行排序 那么您确实应该考虑它 使用颜
  • ProgressDialog 嵌套在另一个空白对话框中

    替代文本http img252 imageshack us img252 643 snakesonadialog png http img252 imageshack us img252 643 snakesonadialog png 嗨伙
  • 条件线程中断

    在我正在编写的一些代码中 有几个地方我做了这样的事情 public MyThread extends Thread boolean finished false BlockingQueue
  • 在多少种语言中,Null 不等于任何非 Null 的东西?

    在多少种语言中 Null 不等于任何非 Null 的东西 SQL 作为一种逻辑语言 就是这样 因为 null 意味着未知 未定义 然而 在编程语言 例如 C 或 C 中 空指针 引用是具有特定含义的特定值 什么都没有 两个无是等价的 但两个
  • 为什么 console.log 的行为是这样的?

    在 Node js 解释器上 console log A newline character is written like n output is A newline character is written like n 但是当你简单地
  • 如何在 Windows 上使用 ImageMagick 命令行?

    我的目标是确定我拥有的 jpeg 图像的压缩参数 据我了解这个答案 https stackoverflow com questions 2024947 is it possible to tell the quality level of
  • Xamarin.iOS 中带有填充的 UILabel?

    我正在尝试创建一个UILabel在我的 Xamarin iOS 应用程序中使用填充 原生 Objective C 应用程序中最流行的解决方案是重写drawTextInRect void drawTextInRect CGRect rect
  • Emacs:临时缓冲区的弹出底部窗口

    我想要一个用于临时缓冲区的弹出底部窗口 例如汇编 竣工数量等 即使根窗口水平分割 它也应该垂直分割整个框架 例如 M x 编译前 After 我绝对满意ecb 编译窗口 http ecb sourceforge net docs ecb c
  • while 和 for 哪个循环更快?

    您可以使用 for 和 while 循环获得相同的输出 While i 0 while i lt 10 print i n i For for i 0 i lt 10 i print i n 但哪一个更快呢 这显然取决于特定语言的解释器 编
  • IEnumerator 实现

    我有一个这个代码 public class SomeClass
  • 消除网格间隙

    我有一个 div 其元素对齐为一行 这是它的 css 类 myRow display grid grid template columns 0 1fr 0 1fr 2fr 3fr 2fr grid column gap 10px grid
  • 如何在 OpenSSL 中获取 SSL 证书

    因此 我一直在寻找如何在我正在开发的 C 应用程序中的 OpenSSL 中验证服务器的证书 我终于得到了提示 但是 我仍然缺少一些步骤 所以我发现OpenSSL有一个名为s client的ssl客户端应用程序 当我使用以下命令时 echo
  • 自定义qt项目时使用条件

    再会 我有一个 qt 项目 我想使用 pro 文件条件对其进行自定义 值得注意的是 我想使用一个 pro 文件来获取多个输出 如下所示 DEFINES APP1 0 APP2 1 DEFINES TYPE APP1 if TYPE APP1
  • AG-Grid 大数据集渲染时间(慢)

    我有一个网格 其中包含大量但合理的数据 大约 12 000 个单元格 340 列和 34 行 我知道这看起来像是一个横向表格 但对于我们的应用程序来说 它更可能有大量的列和更少的行 当数据约为 2300 个单元格 68 列和 34 行 时