“现代”,因为该定义可能会随着时间而改变(特别是我指的是桌面浏览器)
“handle”,因为它可能因机器配置/内存而异,但我指的是一般用例。
在我试图解决涉及大型数据集的特定问题时,我想到了这个问题。
本质上,每当对特定数据集进行更改时,我都会返回完整的数据集,并且我必须在浏览器中呈现这些数据。
因此,例如,在 websocket 上,我收到一个推送事件,告诉我数据集发生了变化,然后我必须通过抓取现有的 DOM 元素,复制它,使用类名用这个集合中的数据填充元素,以 HTML 呈现这个数据集或其他元素标识符,然后将其添加回 DOM。
请记住,此数据集中的任何对象(JSON)可能有多达 1000+ 个子对象,并且可能有多达 10,000+ 个父对象,因此您可以看到可能存在返回数据集向上的实例朝向 1,000,000 => 10,000,000 个数据点或更多。
现在有趣的部分来了,我必须渲染这些东西。对于每个数据点,可能有 3 或 4 个标签用于呈现和设置数据样式,并且可能有任何这些标签的事件侦听器(可能在父容器上使用委托来减轻事情)。
总而言之,可能有很多传入信息需要呈现,我正在尝试找出处理这种情况的最佳方法。
理想情况下,您只想呈现发生更改的单个数据点的更改,而不是重新呈现整个集合,但由于后端的设计方式,这可能不是一个选项。
我在这里主要关心的是了解浏览器/DOM 的局限性,并从前端的角度来看这个问题。后端肯定会发生一些变化(数据设计、缓存、分页),但这不是这里的重点。
这不是 HTML/DOM 的 典型 用例,因为我知道存在限制,但它们到底是什么?我们是否仍然限制在大约 3000-4000 个元素?
我有很多 相关 的 子 问题正在 积极 查找 , 但我认为与 stackoverflow 社区的其他成员分享一些想法并尝试将有关此问题的一些信息汇集在一起会很好。
现代浏览器在开始变得缓慢/无响应之前可以处理的“合理”数量的 DOM 元素是多少?
如何对浏览器可以处理的 DOM 元素数量进行基准测试?
处理需要渲染的大型数据集有哪些 策略(除了分页)?
与使用 jQuery 或正则表达式相比,从 data/json(在前端)渲染 html 的模板框架(如 mustache 和 handlebars)是否更高效?
原文由 qodeninja 发布,翻译遵循 CC BY-SA 4.0 许可协议
这是一个只有精通统计学的答案才能准确和全面的问题。
为什么
合适的方程是这样的,其中 N 是节点数,字节数N是在 DOM 中表示它们所需的总字节数,节点索引范围是
n ∈ [0, N)
,bytesOverhead 是用于一个节点的内存量具有绝对最小属性配置且没有 innerHTML 的节点,bytesContent 是用于填充此类最小节点的内存量。问题中要求的值是 N 在最坏情况下的手持设备、操作系统、浏览器和操作条件下的最大值。为每个排列求解 N 并非易事。上面的等式揭示了三个依赖项,每个依赖项都可能极大地改变答案。
依赖关系
严格的解决方案
可以运行测试以确定 (1) 和 (2) 用于手持设备上使用的每个常见 http 用户代理。可以通过配置 Web 服务器的日志记录机制来获取任何给定站点的用户代理分布,以放置 HTTP_USER_AGENT(如果默认情况下不存在),然后在日志中剥离除该字段以外的所有字段并计算每个值的实例.
每个字符的字节数需要针对属性值和 UTF-8 内部文本(或任何编码)进行测试,以获得一对用于计算 (1) 的明确因素。
可用的内存也需要在各种常见条件下进行测试,这本身就是一项重大的研究项目。
选择的 N 的特定值必须为零才能处理实际的最坏情况,因此可以选择一定比例的内容、节点结构和运行时条件的典型情况。例如,可以使用某种形式的随机 _原位_(在正常环境条件下)研究来获取案例样本,并找到满足 95% 这些案例的 N。
或许可以用上述方法测试一组案例,并将结果放在表格中。这代表了对您问题的直接回答。
我猜想一个受过良好教育的移动软件工程师需要数学,特别是统计,五个全职周才能获得合理的结果。
更实际的估计
人们可以猜测最坏的情况。经过整整几天的研究和一些概念验证应用程序,这个提议可以得到改进。没有时间这样做,这是一个很好的初步猜测。
考虑允许 1 GB 用于 DOM 的手机,因为正常操作条件使用 4 GB 中的 3 GB 用于上述目的。人们可能会假设一个节点的平均内存消耗如下,以获得一个大概的数字。
在这种情况下 N worst_case ,最坏情况下的最大节点数,
但是,如果完全可以避免的话,我不会在具有三百万个 DOM 节点的浏览器中构建文档。考虑采用以下更常见的做法。
常见做法
最好的解决方案是保持远低于 N worst_case可能的值,并使用标准 HTTP 设计技术将节点总数减少到可能的程度。