API/Application 设计:用新数组替换非常大的数组或修改现有数组
API/Application Design: Replace with very large array with a new array or modify the existing array
我有一个非常大的对象数组(嵌套对象)。
var array = [
{ a: "a", b: { .. }, c:"c", ... },
{...}
]
经过一些 API 调用后,我得到了一个包含 1 个修改元素的全新数组,我确切地知道哪个元素被修改了。
将 array
赋值给新值或仅替换修改后的对象是否是一个好主意(就内存使用和性能而言)。
是否需要修改 API 以仅发送修改后的对象并相应地更新数组?
API 是由另一个团队开发的,它会根据每个请求传输大量数据。我需要一个可靠的技术答案来说服他们更改 API 以仅发送所需的数据并在客户端进行修改。
如果
"I know exactly which element is modified"
你的意思是你知道修改元素的确切位置,那么替换它就是一个O(1)
操作:
array[positionOfModified] = modified;
否则,您将不得不找到该元素,这通常是一个 O(N)
操作,除非您在数组已排序 (O(logN)
) 的情况下执行类似二进制搜索的操作。
因此,就速度而言,替换修改后的对象可能比仅替换数组引用更慢:
array = newArray;
但是,space(内存)改进可能比可能的速度下降要大得多。
仅返回修改后的元素会减少您的带宽,因为您将发送单个对象而不是大型数组。如果此请求频繁发生(许多用户多次请求,可能同时请求),每次都返回整个数组,您将面临 congesting your network 的风险。
应用程序内存使用也将得到改善,因为您将覆盖单个对象而不是数组,因此垃圾收集器只需担心清理修改后的对象,而不是整个先前的数组。替换大型数组的引用,尤其是如果经常执行此替换(可能比 GC 执行其清理周期更快),可能会很快耗尽您的内存。
理想情况下,您可以将修改后的对象及其在数组中的位置发回,例如:
{
element: { ... }
position: ...
}
这将允许您使用小型 memory/bandwidth,同时保持更新过程持续运行。
array[response.position] = response.element;
我有一个非常大的对象数组(嵌套对象)。
var array = [
{ a: "a", b: { .. }, c:"c", ... },
{...}
]
经过一些 API 调用后,我得到了一个包含 1 个修改元素的全新数组,我确切地知道哪个元素被修改了。
将
array
赋值给新值或仅替换修改后的对象是否是一个好主意(就内存使用和性能而言)。是否需要修改 API 以仅发送修改后的对象并相应地更新数组?
API 是由另一个团队开发的,它会根据每个请求传输大量数据。我需要一个可靠的技术答案来说服他们更改 API 以仅发送所需的数据并在客户端进行修改。
如果
"I know exactly which element is modified"
你的意思是你知道修改元素的确切位置,那么替换它就是一个O(1)
操作:
array[positionOfModified] = modified;
否则,您将不得不找到该元素,这通常是一个 O(N)
操作,除非您在数组已排序 (O(logN)
) 的情况下执行类似二进制搜索的操作。
因此,就速度而言,替换修改后的对象可能比仅替换数组引用更慢:
array = newArray;
但是,space(内存)改进可能比可能的速度下降要大得多。
仅返回修改后的元素会减少您的带宽,因为您将发送单个对象而不是大型数组。如果此请求频繁发生(许多用户多次请求,可能同时请求),每次都返回整个数组,您将面临 congesting your network 的风险。
应用程序内存使用也将得到改善,因为您将覆盖单个对象而不是数组,因此垃圾收集器只需担心清理修改后的对象,而不是整个先前的数组。替换大型数组的引用,尤其是如果经常执行此替换(可能比 GC 执行其清理周期更快),可能会很快耗尽您的内存。
理想情况下,您可以将修改后的对象及其在数组中的位置发回,例如:
{
element: { ... }
position: ...
}
这将允许您使用小型 memory/bandwidth,同时保持更新过程持续运行。
array[response.position] = response.element;