【问题标题】:Any performance difference between data from function arguments vs assigned variable?来自函数参数的数据与分配的变量之间的性能差异?
【发布时间】:2012-09-07 09:23:45
【问题描述】:

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

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

对比

// 示例 2 函数人(){ 变种巨大数据; this.set = 函数(数据){ 巨大的数据 = 数据; } this.info = 函数() { 控制台.log(hugeData); } } 荷马 = 新人(); Homer.set(hugeData); 荷马.info();

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

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

谢谢。

【问题讨论】:

  • 性能问题应该得到您自己的研究和测试结果的支持。您是否尝试在 1M 迭代循环中同时计时? 你的结果是什么?然后我们可以尝试运行相同的代码(它必须按原样运行)并比较和讨论我们的结果。

标签: javascript performance architecture


【解决方案1】:

不,一点也不。

现在不做详细介绍,形式参数局部变量都存储在称为激活对象(在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

【讨论】:

    【解决方案2】:

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

    hugeData = data;

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

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

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

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

    【讨论】:

    • 你是对的。它是一个对象;要具体的视图模型对象
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-08-13
        • 2018-05-22
        • 1970-01-01
        • 2015-11-29
        • 1970-01-01
        • 2012-06-25
        • 2023-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多