API /应用程序设计:使用新数组替换非常大的数组或修改现有数组

时间:2016-10-19 17:44:04

标签: javascript arrays performance optimization api-design

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

如果通过

  

"我确切地知道修改了哪个元素"

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

array[positionOfModified] = modified;

否则,您将不得不找到该元素,这通常是O(N)操作,除非您执行类似二进制搜索的操作(如果数组已排序(O(logN))。

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

array = newArray;

然而,空间(记忆)的改善可能会比可能的速度回归大得多。

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

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

理想情况下,你可以做的是发送修改后的对象及其在数组中的位置,如:

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

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

array[response.position] = response.element;