Javascript对象函数参数性能

Javascript object function parameters performance

本文关键字:性能 参数 函数 对象 Javascript      更新时间:2023-09-26

我阅读了一些线程,了解当参数是对象时,javascript函数参数传递是如何工作的;我注意到传递方法有很多混乱,至少在术语上是这样:通过引用传递、通过复制引用传递等等。这个问题不是关于这个传递方法是如何命名的,也不是关于它在内部是如何工作的,而是涉及到这个问题的某种答案。

我有一些非常大的对象,作为参数传递给函数;我需要了解,对于每个函数调用(我有很多调用),对象传递是否意味着对象的某个副本,因此内存消耗、计算工作量和内存泄漏风险与传递的对象大小成正比,或者它是否以非大小成比例的后果方式传递。

由于在函数中更改对象的属性会更改外部范围中的对象,但更改对象本身不会,我认为函数内部用于存储和"引用"参数的内存并不取决于其大小,因为对象似乎不会被复制,但我需要确定它

抱歉我的英语解释不好!

EDIT:答案在某种程度上涉及对JS传递模式的深入了解,但核心问题是实际案例的性能改进,因此任何理论信息都很有用,但最重要的信息是计算和内存消耗。

用例1(性能):假设我有一个函数访问其参数的两个成员,并在第三个成员上写入一些结果,在1000个不同的对象上执行1000次。问题是:如果对象仅由3个属性组成,而如果它有其他100个属性,那么合成循环将花费几乎相同的时间?是否只有参数复制开销或在较大对象内选择属性才会导致差异?实际测试可能很大程度上取决于浏览器,所以我需要技术性的、通用的有效答案。

用例2:我有一个100MB的对象,传递给一个函数。在执行期间,我的内存占用是否增加了100MB?因此,任何内存泄漏,例如,由控制不当的机柜引起的,都是更危险的。

简单的答案是不复制对象,只传递对对象的引用作为参数。

更精确的答案是,在Javascript中,所有参数都是通过值传递的。对于数字等简单类型,这意味着值被复制。对于对象是指复制对对象的引用。

正如您所注意到的,参数本身是一个独立的副本,但该参数指向与您在函数调用中使用的变量相同的对象。

编辑:

对于用例1,唯一的区别在于从具有更多属性的对象访问属性。在少数或多个属性之间定位属性的差异很小,您将看到的唯一实际差异来自这样一个事实,即在循环遍历对象时,必须将对象带入内存缓存,但这与将它们传递给函数无关。

对于用例2,对象没有重复,对象在内存中仍然只存在一次。

请查看以下答案:

在Javascript 中通过引用传递变量

简单地说,您的对象是"通过引用"传递的,从性能的角度来看,用大对象或小对象调用函数应该没有区别。

话虽如此,整体性能取决于功能。它可以复制对象,执行AJAX调用等,所有这些都可能会执行,也可能不会执行,这取决于对象的大小。

对于专门进行的函数调用的性能,应该没有区别。