2

我正在编写一个为用户求解方程的代码。用户将能够输入矩阵、向量等。现在,当我解这些方程时,我将解写到一个表格中,每一行代表任何给定的变量或方程。在计算过程中用于保存方程的 javascript 对象被破坏。我这样做是为了防止将大量数据存储在内存中并可能减慢脚本的速度。由于稍后需要一个数组,因此从相应的表行中将其读入一个对象。

我想知道像这样在 DOM 中保存内存与将其保存在内存中的对象中相比如何。通过将这些东西作为对象而不是 DOM 保存在内存中,我更有可能减慢代码执行速度?此外,由于这些对象需要由代码的多个部分访问,因此它们必须是全局对象。正确的?

4

2 回答 2

4

一句话,没有。

在 Web 开发中有一个不变的规则:DOM 很慢

选择、访问和迭代 DOM 元素以及读取和修改它们的属性是您在浏览器 JS 中可以做的最慢的事情之一。另一方面,使用原生 JS 对象非常快。通常,我会尽可能避免使用 DOM。

您做出(不正确的)假设,即低内存使用率在某种程度上等同于提高性能。事实上,增加内存使用量会提高应用程序性能的情况通常是1(而不仅仅是在浏览器中) 。通过将计算结果缓存在内存中的特性,您可以避免稍后重新构建数据的处理器和时间密集型需求。当然,您必须在内存使用与性能需求之间取得平衡。

在您的情况下,我肯定会将方程对象保存在内存中。它可能使用了令人惊讶的少量内存。例如,我刚刚在 Chrome 中创建了一个包含 1,000 个整数的数组,内存分析器告诉我它使用了不到 40 kB——几乎所有的对象开销。这些值本身只占用 4 kB – 1000 * 4 字节(32 位)。

当您考虑读取 DOM 以重新生成对象的例程可能需要数十到数百毫秒(或更糟,取决于复杂性)来运行时,您为什么不只生成一次对象并保留它,尤其是因为成本这么低?

但是,与所有性能问题一样,真正的答案是您必须分析您的应用程序以查看性能瓶颈的真正位置。在您使用应用程序时,使用 Chrome 的开发者工具的配置文件选项卡获取CPU 配置文件(随时间测量处理器利用率)和堆快照(即时测量内存使用情况)。

1 - 这实际上取决于您的程序是否使用了太多内存以至于必须换出页面。在 16 GB RAM 已司空见惯的台式机上,您几乎无需担心。但是,在资源更加受限的移动设备上观察内存使用情况仍然很重要。

于 2013-02-21T03:10:17.367 回答
1

我想知道像这样在 DOM 中保存内存与将其保存在内存中的对象中相比如何。

测试一下,我希望 DOM 使用更多内存并且访问速度要慢得多。在任何情况下,除非您存储了大量的东西,否则内存影响可能很小。

通过将这些东西作为对象而不是 DOM 保存在内存中,我更有可能减慢代码执行速度?

我期望的相反。访问 DOM 会慢很多。

此外,由于这些对象需要由代码的多个部分访问,因此它们必须是全局对象。正确的?

错误的。您可以在闭包中保存引用,或将所有对象放入单个数组或对象中。无论如何,全局对象本身并不坏,它们只是被认为是不整洁的并增加了名称冲突的机会。

于 2013-02-21T03:12:12.857 回答