javascript - API/应用程序设计 : Replace with very large array with a new array or modify the existing array

标签 javascript arrays performance optimization api-design

我有一个非常大的对象数组(嵌套对象)。

var array = [
    { a: "a", b: { .. }, c:"c", ... },
    {...}
]

在一些 API 调用之后,我得到了一个包含 1 个修改元素的全新数组,并且我确切地知道哪个元素被修改了。

  1. array 分配新值或仅替换修改后的对象是否是一个好主意(就内存使用和性能而言)。

  2. 我是否需要修改 API 以仅发送修改后的对象并相应地更新数组?

该 API 由另一个团队开发,它会根据每个请求传输大量数据。我需要一个可靠的技术答案来说服他们更改 API 以仅发送所需的数据并在客户端进行修改。

最佳答案

如果通过

"I know exactly which element is modified"

你的意思是你知道修改元素的确切位置,然后替换它是一个O(1)操作:

array[positionOfModified] = modified;

否则,您将不得不找到该元素,这通常是一个 O(N) 操作,除非您在数组已排序时执行类似二分查找的操作 (O(logN) )。

因此,就速度而言,替换修改后的对象可能比仅替换数组引用更慢:

array = newArray;

但是,空间(内存)的改进可能比可能的速度下降要大得多。

仅返回修改后的元素会减少带宽,因为您将发送单个对象而不是大型数组。如果此请求频繁发生(许多用户多次请求,可能同时请求),则每次都返回整个数组,您将面临 congesting your network 的风险。 .

应用程序内存使用也将得到改善,因为您将覆盖单个对象而不是数组,因此垃圾收集器只需担心清理修改后的对象,而不是整个先前的数组。替换大型数组的引用,特别是如果经常执行此替换(可能比 GC 执行其清理周期更快),可能会很快耗尽您的内存。

理想情况下,您可以将修改后的对象及其在数组中的位置发回,例如:

{
  element: { ... }
  position: ...
}

这将允许您使用较小的内存/带宽,同时保持更新过程持续运行。

array[response.position] = response.element;

关于javascript - API/应用程序设计 : Replace with very large array with a new array or modify the existing array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40138208/

相关文章:

java - 在 Java 中复制大型数组的最有效方法

javascript - Google Apps 脚本库和脚本分发

javascript - 解析来自 Socket 的 HTTP 消息

c++ - 个别实例有效,但数组显示内存损坏

javascript - 我搞砸了 JSON 对象、数组和字符串

python - 排列的秩

javascript - 推荐用于 JQuery 的 JavaScript HTML 模板库?

HTML 输入框内的 Javascript 函数

C - 将一个文件保存到两个单独的数组并打印每个元素

c# - 是否有 LINQ 扩展或(一组合理/高效的 LINQ 扩展)确定集合是否至少有 'x' 个元素?