【问题标题】:Safe maximum amount of nodes in the DOM? [closed]DOM 中安全的最大节点数? [关闭]
【发布时间】:2017-07-24 05:39:40
【问题描述】:

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

如何计算之前的估算值

  • 失败
  • 崩溃
  • 响应显着退化

另外,是否有任何浏览器在打开每个标签页时都不能越过的硬性限制?

关于事先关闭

这与下面 cmets 中的其他问题不同。它还提出了一个非常具体的问题,寻求一种估计方法。没有任何重复的、广泛的或基于它的意见,尤其是现在为了清楚起见,它被重写了,而没有改变作者表达的兴趣。


脚注

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

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

【问题讨论】:

标签: html dom cross-browser out-of-memory


【解决方案1】:

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

为什么

适当的公式是这样的,其中 N 是节点数,bytesN 是在 DOM 中表示它们所需的总字节数,节点索引 n ∈ [0, N)。

字节N = ∑N (bytesContentn + bytesOverheadn)

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

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

严谨的解决方案

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

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

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

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

也许可以通过上述方式对一组案例进行测试,并将结果放在一个表格中。这样可以直接回答您的问题。

我猜想,要想获得合理的结果,需要一名具有良好数学背景的优秀移动软件工程师和一名统计专家全职工作,并且预算充足,大约需要 4 周时间。

更实际的估计

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

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

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

在这种情况下,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.

但是,如果可以避免的话,我不会在具有 300 万个 DOM 节点的浏览器中构建文档。考虑采用以下更常见的做法。

常见做法

最好的解决方案是远低于 N 可能的值,并使用标准 HTTP 设计技术将节点总数减少到可能的程度。

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

【讨论】:

  • 我建议在 HTTP 设计技术列表中添加分页或通过数据集开窗,这与第三个项目符号相符。我还将节点开销增加到超过 100 个字节,因为有指向数据的指针、属性的哈希映射、集合头和链接的开销、指向每个继承父级的跳转表的指针以及事件侦听器指针和结构。
【解决方案2】:

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

【讨论】:

  • 1 个非文本 DOM 节点平均占用多少内存?
  • 我认为这取决于浏览器。
  • 附带说明,没有浏览器是 32 位的了。甚至在移动平台上也不行。 (并不是说无论如何你都可以在 Android 设备上使用 4GB+)
  • @Krumelur:对于 Linux 和 Android,内核虚拟内存管理器中设置了 4GB 的限制,与系统总线和/或处理器的位数无关。这只是意味着 4GB 专用于 Linux 中每个正在运行的进程 - 而不是全部。
  • @Thevs 你指的是 ulimit -v 还是别的什么?
猜你喜欢
  • 2012-11-03
  • 2014-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 2011-06-30
  • 2013-02-01
相关资源
最近更新 更多