函数参数与赋值变量的数据之间的性能差异是什么?

时间:2012-09-14 08:24:13

标签: javascript performance architecture

这可能听起来像一个菜鸟问题,但是这里有; 基本上,我将大量数据从一个对象传递到另一个对象。以下是一个简化的例子。

// Example 1
function Person(hugeData) {
    this.info = function() {
        console.log(hugeData);
    }
}
Homer = new Person(hugeData);
Homer.info();

相比
// Example 2
function Person() {
    var hugeData;

    this.set = function(data) {
        hugeData = data;
    }

    this.info = function() {
        console.log(hugeData);
    }
}
Homer = new Person();
Homer.set(hugeData);
Homer.info();

两个代码段之间在性能方面有很大差异吗?请关注示例的上下文而不是代码本身(设置对象变量与通过参数传递)。

虽然上面的示例适用于Javascript,但我还想知道相同的原则是否适用于其他编程语言,如PHP。

感谢。

4 个答案:

答案 0 :(得分:4)

不,完全没有。

现在没有详细介绍,正式参数局部变量都存储在这样的激活对象中(在ES3中)或者词汇环境记录(ES5)。

因此规格访问时间应相同。


如果您想了解详情,请查看:

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/

http://dmitrysoshnikov.com/ecmascript/es5-chapter-3-2-lexical-environments-ecmascript-implementation/


测试用例:http://jsperf.com/formal-parameters-vs-local-variables-access-time

答案 1 :(得分:2)

我认为你的问题的重点是这一行......

hugeData = data;

...在您的代码中可能会影响性能。

答案是否定的,但事实并非如此(至少不会影响应用程序的性能)。

如果hugeData引用一个对象(并且记住JS中的数组本质上是对象),它实际上只存储对该对象的引用。引用是将被复制的内容,而不会重复对象的内容。

如果hugeData引用字符串,可以更复杂......但据我所知,大多数现代浏览器(请MDN检查为例子)现在实现'copy-on-writing'技术。换句话说,这里的字符串也不会重复。

答案 2 :(得分:0)

通过变量传递是最好的事情。因为很明显你的巨大数据不是原始的,所以你只能在函数上下文中引用它。 看看jAndy的回答。

答案 3 :(得分:0)

在这种情况下很难概括,因为Javascript的每个实现都是不同的。

我可以想象当你通过创建一个对象传递一大块数据时,你正在保存一个内存的重新分配,当你首先用少量数据创建对象然后添加大量数据时就会发生这种情况。它以后。但是大多数JS实现都会将大数据块存储在引用中,因此它不太可能真正重要。