2

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

// 示例 1
函数人(巨大数据){
    this.info = 函数() {
        控制台.log(hugeData);
    }
}
荷马 = 新人(巨大数据);
荷马.info();

和....相比

// 示例 2
函数人(){
    变种巨大数据;

    this.set = 函数(数据){
        巨大的数据 = 数据;
    }

    this.info = 函数() {
        控制台.log(hugeData);
    }
}
荷马 = 新人();
Homer.set(hugeData);
荷马.info();

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

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

谢谢。

4

4 回答 4

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

于 2012-09-14T08:30:59.537 回答
2

我认为你的问题的重点是这条线是否......

hugeData = data;

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

答案是否定的,不是(至少不会影响应用程序的性能)。

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

如果hugeData指的是一个字符串,它可能会更复杂一些......但据我所知,大多数现代浏览器(例如检查MDN)现在都实现了“写时复制”技术。换句话说,这里的字符串也不会被复制。

于 2012-09-14T08:38:52.733 回答
0

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

于 2012-09-14T08:33:03.990 回答
0

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

我可以想象,当您在创建对象时传递大量数据时,您正在节省内存的重新分配,这会发生在您先用少量数据创建对象,然后再向其中添加大量数据时。但是大多数 JS 实现无论如何都会将大数据块存储在引用中,因此它不太重要。

于 2012-09-14T08:35:08.627 回答