DOM 中安全的最大节点数?

Safe maximum amount of nodes in the DOM?

对于 Web 应用程序,给定目标移动设备中的可用内存1 运行 目标移动浏览器2 , 如何估计可以通过 HTML 或 DHTML?

生成的最大 DOM 节点数,包括文本节点

之前如何计算估算值

此外,对于任何浏览器是否有硬性限制,不能在每次打开标签页时交叉访问?

关于提前关闭

这与下面评论中的其他问题不同。它还提出了一个非常具体的问题,寻求一种估计方法。没有任何重复的、广泛的或基于它的意见,特别是现在为了清晰起见,在不改变其作者表达的利益的情况下重写了它。


脚注

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

[2] 火狐、Chrome、IE 11、Edge、Opera、Safari

DOM没有限制。相反,运行 应用程序有一个限制,称为 'browser'。与所有其他应用程序一样,它有 4GB 的虚拟内存限制。使用多少常驻内存取决于物理内存量。使用低 RAM,您可能会遇到不断换入和换出的情况(具有可承受的交换内存量)。某些系统(Linux、Android)有一个特殊的内核任务,可以在系统内存不足时终止应用程序。此外,在 Linux 类系统中,应用程序的最大大小通常限制为 2MB 的虚拟内存,可以通过 ulimit 命令更改。

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

为什么

合适的方程是这样的,其中N是节点数,bytesN是在DOM中表示它们所需的总字节数,节点指数 n ∈ [0, N).

bytesN = ∑N (bytesContentn + bytesOverheadn)

问题中要求的值是N在最坏情况下的手持设备、操作系统、浏览器和操作条件下的最大值。为每个排列求解 N 并非易事。上面的等式揭示了三个依赖项,每个依赖项都可能极大地改变答案。

  1. 节点的平均大小取决于每个节点用于保存内容(例如 UTF-8 文本、属性名称和值或缓存信息)的平均字节数。
  2. DOM 对象的平均开销取决于管理每个文档的 DOM 表示的 HTTP 用户代理。 W3C 的 Document Object Model FAQ 状态,"While all DOM implementations should be interoperable, they may vary considerably in code size, memory demand, and performance of individual operations."
  3. 可用于 DOM 表示的内存取决于默认使用的浏览器(这可能因浏览器手持设备供应商或用户偏好而异)、默认浏览器的用户覆盖、操作系统版本、手持设备内存容量、常见后台任务等内存占用。

严格解

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

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

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

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

也许可以用上述方法测试一组案例,并将结果放在table中。这样可以直接回答您的问题。

我猜想需要一位具有良好数学背景的优秀移动软件工程师和一位统计专家全职工作并花费大量预算大约四个星期才能获得合理的结果。

更实用的估计

可以猜到最坏的情况。经过整整几天的研究和一些概念验证应用程序,这个提议可以得到改进。没有时间这样做,这是一个很好的初步猜测。

考虑一个允许 1 GB 用于 DOM 的单元格 phone,因为正常操作条件使用 4 GB 中的 3 GB 用于上述目的。人们可能会假设一个节点的平均内存消耗如下,以获得一个大概的数字。

  • 每个节点 40 个字符的内部文本每个字符 2 个字节
  • 4 个属性值每个字符 2 个字节,每个 10 个字符
  • 4 个属性名称每个字符 1 个字节,每个字符 4 个字符
  • 160 字节用于 C/C++ 节点开销

本例Nworst_case,最坏情况max nodes,

= 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 设计技术尽可能减少节点总数。

  • 减少任何给定页面上显示的内容的大小和复杂性,这也会提高视觉和概念的清晰度。
  • 从服务器请求最少数量的数据,使用窗口技​​术延迟尚不可见的内容,或以精心计划的方式平衡响应时间和内存消耗。
  • 使用异步调用来辅助上述极简主义。