html - DOM 中安全的最大节点数?

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

关闭。这个问题需要更多focused .它目前不接受答案。












想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post .

4年前关闭。




Improve this question




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

如何计算之前的估计

  • 故障
  • 崩溃
  • 响应显着下降

  • 另外,任何浏览器是否有硬性限制,不能在打开的每个标签页上交叉?

    关于提前关闭

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

    脚注

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

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

    最佳答案

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

    为什么

    合适的等式是这样的,其中 N 是节点数,bytesN 是在 DOM 中表示它们所需的总字节数,以及节点索引 n ∈ [0, N) .

    bytesN = ∑N (bytesContentn + bytesOverheadn)



    问题中要求的值是在最坏情况下手持设备、操作系统、浏览器和操作条件下 N 的最大值。为每个排列求解 N 并非易事。上面的等式揭示了三个依赖关系,每个依赖关系都可能彻底改变答案。
  • 节点的平均大小取决于每个节点用于保存内容的平均字节数,例如 UTF-8 文本、属性名称和值或缓存信息。
  • DOM 对象的平均开销取决于管理每个文档的 DOM 表示的 HTTP 用户代理。 W3C Document Object Model FAQ声明,“虽然所有 DOM 实现都应该是可互操作的,但它们在代码大小、 内存需求 和单个操作的性能方面可能会有很大差异。”
  • 可用于 DOM 表示的内存取决于默认使用的浏览器(取决于手持设备供应商或用户喜欢的浏览器)、默认浏览器的用户覆盖、操作系统版本、手持设备的内存容量设备、常见后台任务和其他内存消耗。

  • 严谨的解决方案

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

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

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

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

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

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

    更实用的估算

    人们可以猜测最坏的情况。通过几天的研究和一些概念验证应用程序,可以完善该提案。没有时间这样做,这是一个很好的初步猜测。

    考虑允许 1 GB 用于 DOM 的手机,因为正常操作条件使用 4 GB 中的 3 GB 用于上述目的。人们可能假设一个节点的平均内存消耗如下,以获得一个大概的数字。
  • 每个节点 40 个字符的内部文本每个字符 2 个字节
  • 每个字符 2 个字节,用于 4 个属性值,每个 10 个字符
  • 每个字符 1 个字节,用于 4 个属性名称,每个 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 设计技术将节点总数减少到可能的程度。
  • 减少任何给定页面上显示的内容的大小和复杂性,这也提高了视觉和概念的清晰度。
  • 从服务器请求最少量的数据,使用窗口技​​术推迟尚不可见的内容,或以精心计划的方式平衡响应时间与内存消耗。
  • 使用异步调用来协助上述极简主义。
  • 关于html - DOM 中安全的最大节点数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42590269/

    相关文章:

    javascript - 如何使用 JavaScript 改变多个元素的 CSS

    css - 使非常简单的 html 页面跨浏览器与 CSS 兼容

    javascript - 两个具有相同值但不同代码的复选框(脑筋急转弯)

    javascript - 从下拉列表中选择值时触发 AJAX

    html - 无法设置表单提交按钮的样式

    javascript - 如何获取克隆元素的outerHTML?

    javascript - 如何使用 JavaScript 控制台对现有 DOM 元素进行排序?

    javascript - 从在 chrome 和 firefox 上运行的 html 页面调用 .dll 函数

    javascript - 您遇到过哪些跨浏览器问题?

    javascript - div改变位置时有路径的概念吗?