函数参数中的数据与指定变量之间的任何性能差异
Any performance difference between data from function arguments vs assigned variable?
这听起来像是一个愚蠢的问题,但这里是;基本上,我将大量数据从一个对象传递到另一个对象。下面是一个简化的例子。
//示例1职能人员(hugeData){this.info=函数(){console.log(hugeData);}}Homer=新人(hugeData);Homer.info();
与相比
//示例2函数Person(){var hugeData;this.set=函数(数据){hugeData=数据;}this.info=函数(){console.log(hugeData);}}Homer=新人物();荷马集(hugeData);Homer.info();
这两个代码片段在性能方面有很大区别吗?请关注示例的上下文,而不是代码本身(设置对象变量与传递参数)。
虽然上面的例子是针对Javascript的,但我也想知道同样的原理是否适用于其他编程语言,如PHP。
谢谢。
不,一点也不。
现在不详细介绍,形式参数和局部变量都存储在所谓的激活对象(在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
我想你问题的重点是这行。。。
hugeData = data;
在您的代码中可能会影响性能。
答案是否定的,不是(至少不会影响应用程序的性能)。
如果hugeData
引用一个对象(记住JS中的数组本质上是对象),那么它实际上只存储对该对象的引用。引用是将被复制的内容,而不会复制对象的内容。
如果hugeData
指的是字符串,则可能会更复杂。。。但据我所知,大多数现代浏览器(例如查看MDN)现在都实现了"写时复制"技术。换句话说,字符串在这里也不会重复。
传递变量是最好的方法。因为很明显,你的庞大数据不是一个基元,所以你只会在函数上下文中引用它。看看jAndy的回答。
在这种情况下很难概括,因为Javascript的每个实现都不同。
我可以想象,当你在创建一个对象时传递大量数据时,你节省了内存的重新分配,当你先创建一个数据很少的对象,然后再添加大量数据时就会发生这种情况。但大多数JS实现都会将大数据块存储在引用中,所以它不太可能真正重要。
- 函数参数中的数据与指定变量之间的任何性能差异
- 是否有任何JavaScript UI组件可以显示字符串之间的差异
- Javascript集:任何覆盖元素之间比较的方法
- JavaScriptV5中的绑定和JQuery之间有任何关系吗
- Regex,它搜索一个起始字符,介于两者之间的任何字符,然后是一个结束字符
- 正则表达式选择任何 html 标记之间的字符串
- jQuery - 删除表格行(如果任何单元格包含介于 X 和 Y 之间的值)
- Reg ex 表示特定字符之后和其他字符之间的任何内容
- 如何编写一个正则表达式,匹配除左括号和右括号以及它们之间的任何内容之外的所有内容
- 正则表达式用于在 JavaScript 中查找任何两个数值(范围)之间的所有数字
- 我如何使用 javascript 或 jquery 在单击时在任何 css 属性之间切换
- 新的F和新的F()之间有任何不同
- Regex:匹配日期和冒号之间的任何字符串
- 为什么不'当我按下任何按钮时,这个Javascript代码都能工作并生成一个介于1和3之间的数字
- 除了 JavaScript 之外,是否有任何其他语言在大括号开始位置(同一行和下一行)之间有区别
- AMD兼容的JavaScript-定义然后返回与仅返回之间的任何区别
- javascript匹配以“”开头的字符串;并以“;;以及介于两者之间的任何东西
- Javascript Regex-替换匹配字符串的所有出现,括号之间的任何字符串除外
- f()和(f())之间的任何差异
- window.localStorage.setItem和localStorage.setItem之间是否有任何区别?