Javascript API/应用程序设计:使用新阵列替换超大阵列或修改现有阵列
我有一个非常大的对象数组(嵌套对象) 在一些API调用之后,我得到了一个带有1个修改元素的全新数组,我确切地知道修改了哪个元素Javascript API/应用程序设计:使用新阵列替换超大阵列或修改现有阵列,javascript,arrays,performance,optimization,api-design,Javascript,Arrays,Performance,Optimization,Api Design,我有一个非常大的对象数组(嵌套对象) 在一些API调用之后,我得到了一个带有1个修改元素的全新数组,我确切地知道修改了哪个元素 在内存使用和性能方面,将array指定为新值或仅替换修改过的对象是一个好主意吗 我是否需要修改API以只发送修改过的对象并相应地更新数组 API是由另一个团队开发的,它在每个请求上传输大量数据。我需要一个可靠的技术答案来说服他们更改API,以便只发送所需的数据,并在客户端进行修改。 “我确切地知道修改了哪个元素” 您的意思是您知道修改后的元件的确切位置,然后将其更换为O
array
指定为新值或仅替换修改过的对象是一个好主意吗O(1)
操作:
array[positionOfModified] = modified;
否则,您必须找到元素,这通常是一个O(N)
操作,除非您在数组排序时执行类似于二进制搜索的操作(O(logN)
)
因此,就速度而言,替换修改的对象可能比仅替换数组引用慢:
array = newArray;
然而,空间(内存)的改进可能比可能的速度回归大得多
只返回修改后的元素将减少带宽,因为您将发送单个对象而不是大型数组。如果此请求频繁发生(许多用户多次请求,可能是同时请求),每次都返回整个阵列,那么您将面临风险
应用程序内存使用率也将得到提高,因为您将覆盖单个对象而不是数组,因此垃圾回收器只需清理修改过的对象,而不必清理整个以前的数组。替换大型数组的引用,特别是如果经常进行这种替换(可能比GC的清理周期快),可能会相当快地耗尽内存
理想情况下,您可以做的是将修改后的对象及其在数组中的位置发送回,类似于:
{
element: { ... }
position: ...
}
这将允许您使用较小的内存/带宽,同时保持更新过程的恒定操作
array[response.position] = response.element;
就记忆而言,两者都已经在记忆中了。就性能而言,重新分配基本上是免费的,而修改则需要搜索要修改的内容。API应该返回什么还取决于API调用的形状。无论您做什么,API都应该保持逻辑性、一致性和可预测性。仅从API发送修改后的元素可能不会提高性能,但如果API托管在远程服务器上,它肯定可以提高带宽。我只希望从服务器获取修改后的对象,并用获得的JSON数据动态替换它。我当然可以做
array[position]=newobject
,因为我知道位置。但是array=newarray
也是O(1)
?任何引用赋值都是O(1)
操作,a=3
,b={}
,c=[]
,等等。
array[response.position] = response.element;