DOM中安全的最大节点数量是多少?

16

对于一个Web应用程序,在运行目标移动浏览器2的目标移动设备上可用的内存,如何估计可以通过HTML或DHTML生成的包括文本节点在内的最大DOM节点数量?

在以下情况下,如何进行估算:

  • 故障之前
  • 崩溃之前
  • 响应显著降低之前

另外,是否有任何硬性限制,以防止任何浏览器在打开的每个选项卡中超出限制?

关于先前封闭

这不像下面评论中的其他问题。它也在寻求一种估算方法的非常具体的问题。现在已经重写以提高清晰度,而没有改变作者表达的兴趣。


脚注

[1] 例如,从2013年到2018年销售的Android或IOS移动设备,具有某些特定的RAM容量

[2] Firefox,Chrome,IE 11,Edge,Opera,Safari


2
像往常一样,试试看吧!很难说清楚,因为它取决于页面的布局方式、你所拥有的CSS、过渡效果、JavaScript等等。话虽如此,我倾向于认为,在大约5,000-10,000个DOM元素时,桌面浏览器开始感到相当缓慢。 - JosiahDaniels
2
在不含物理盘片的设备上接近尺寸限制通常不会像在桌面或工作站上那样导致减速,因为交换会导致响应时间明显降低。 - Douglas Daseeco
2个回答

9

这是一个只有统计答案才能准确全面的问题。

为什么

适当的方程式如下,其中N是节点数,bytesN是在DOM中表示它们所需的总字节数,节点索引n ∈ [0,N)

bytesN = ∑N (bytesContentn + bytesOverheadn)

问题中请求的值是在最坏情况下的手持设备、操作系统、浏览器和操作条件下N的最大值。对于每个排列解出N并不容易。上述方程式揭示了三个依赖关系,每个依赖关系都可能极大地改变答案。

  1. 节点的平均大小取决于每个节点中用于保存内容(如UTF-8文本、属性名称和值或缓存信息)的平均字节数。
  2. DOM对象的平均开销取决于管理每个文档的DOM表示的HTTP用户代理。W3C的文档对象模型FAQ指出,“虽然所有DOM实现应该是互操作的,但它们在代码大小、内存需求和单个操作的性能方面可能会有很大差异。”
  3. 可用于DOM表示的内存取决于默认使用的浏览器(这可能因手持设备供应商或用户而异),用户覆盖默认浏览器,操作系统版本,手持设备的内存容量,常见的后台任务和其他内存消耗。

严格解决方案

可以对常用的手持设备上使用的每个HTTP用户代理进行测试以确定(1)和(2)。可以通过配置Web服务器的日志机制以放置HTTP_USER_AGENT(如果默认情况下没有)并在日志中剥离除该字段以外的所有内容,然后计算每个值的实例来获取任何给定站点的用户代理分布。

需要测试字符每个属性值和UTF-8内部文本(或任何编码)的字节数,以获得用于计算(1)的清晰因素对。

还需要在各种常见条件下进行内存可用性测试,这本身就是一个重要的研究项目。

所选的特定N值必须为零,以处理实际最坏情况,因此应选择一定比例的典型内容、节点结构和运行时条件。例如,可以使用某种形式的随机原地(在正常环境条件下)研究对案例进行取样,并找到满足95%这些情况的N。

也许可以测试一组案例并将结果放在表中。这将代表对您的问题的直接回答。

我猜需要一位优秀的移动软件工程师,具有良好的数学背景和统计专家,全职合作并拥有充足的预算约四周时间才能得出合理的结果。
更切实可行的估算如下。进行几天完整的研究和一些概念性应用程序后,可以进一步细化提案。如果没有这样做的时间,则以下是一个很好的第一次猜测。
考虑一部允许DOM使用1 G字节的手机,因为正常操作条件使用4 G字节中的3 G字节用于上述目的。为了得到一个大致的数字,人们可能会假设一个节点的平均内存消耗如下:
- 每个节点的40个字符的内部文本占用2个字节 - 4个属性值,每个属性值10个字符,每个字符占用2个字节 - 4个属性名称,每个属性名称4个字符,每个字符占用1个字节 - C/C ++节点开销160个字节
在这种情况下,Nworst_case是最差情况下的最大节点数。
= 1,024 X 1,024 X 1,024
  / (2 X 40  +  2 X 4 X 10  +  1 X 4 X 4  +  160)

= 3,195,660 . 190,476.

然而,如果可能的话,我不会在浏览器中构建一个有三百万DOM节点的文档。请考虑采用以下更常见的做法。

常规做法

最佳解决方案是尽量保持节点总数远低于N,并使用标准HTTP设计技术尽可能减少节点数量。

  • 减少在任何给定页面上显示的内容的大小和复杂性,这也提高了视觉和概念上的清晰度。
  • 从服务器请求最小量的数据,通过窗口技术推迟尚未可见的内容或者以明智的方式平衡响应时间和内存消耗。
  • 使用异步调用来帮助实现上述极简主义。

2
我建议将分页或窗口化数据集添加到HTTP设计技术清单中,这符合第三个要点。我还会将节点开销增加到100字节以上,因为有指向数据的指针、属性哈希映射、集合头和链接的开销,每个继承父节点跳转表的指针,以及事件侦听器的指针和结构。 - Douglas Daseeco

2

DOM没有限制,但是运行应用程序(即“浏览器”)有一个限制。与所有其他应用程序一样,它具有4GB虚拟内存的限制。使用驻留内存的数量取决于物理内存的大小。如果RAM较低,则可能会出现不断交换的情况(具有可承受的交换内存量)。一些系统(Linux、Android)具有特殊的内核任务,以在系统内存不足时终止应用程序。此外,类似Linux的系统中应用程序的最大大小通常限制为2MB虚拟内存,并可以通过ulimit命令进行更改。


1
一个非文本DOM节点平均占用多少内存? - Walle Cyril
3
这取决于浏览器,我想。 - Thevs
1
顺便提一下,现在没有浏览器是32位的了。即使在移动平台上也是如此。(虽然并不是说你可以在Android设备上使用4GB+) - Krumelur
@Krumelur:对于Linux和Android,4GB的限制是在内核虚拟内存管理器中设置的,与系统总线和/或处理器的位数无关。这只意味着Linux中每个运行的进程都有4GB的专用内存 - 而不是总体上的。 - Thevs
我相信你可以分配超过4GB的虚拟内存。但也许我误解了你的意思。 - Krumelur
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接