Javascript API/应用程序设计:使用新阵列替换超大阵列或修改现有阵列

Javascript API/应用程序设计:使用新阵列替换超大阵列或修改现有阵列,javascript,arrays,performance,optimization,api-design,Javascript,Arrays,Performance,Optimization,Api Design,我有一个非常大的对象数组(嵌套对象) 在一些API调用之后,我得到了一个带有1个修改元素的全新数组,我确切地知道修改了哪个元素 在内存使用和性能方面,将array指定为新值或仅替换修改过的对象是一个好主意吗 我是否需要修改API以只发送修改过的对象并相应地更新数组 API是由另一个团队开发的,它在每个请求上传输大量数据。我需要一个可靠的技术答案来说服他们更改API,以便只发送所需的数据,并在客户端进行修改。 “我确切地知道修改了哪个元素” 您的意思是您知道修改后的元件的确切位置,然后将其更换为O

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

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

  • 在内存使用和性能方面,将
    array
    指定为新值或仅替换修改过的对象是一个好主意吗

  • 我是否需要修改API以只发送修改过的对象并相应地更新数组

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

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

    您的意思是您知道修改后的元件的确切位置,然后将其更换为
    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;