Javascript:对象副本,全局变量和性能
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javascript:对象副本,全局变量和性能,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3484字,纯文字阅读大概需要5分钟。
内容图文
![Javascript:对象副本,全局变量和性能](/upload/InfoBanner/zyjiaocheng/791/a6f31cd560184779a332de82770ea54f.jpg)
我有一个非常复杂的问题要问:)
我目前正在开发一个html5画布游戏.特定于游戏地图的变量位于一个单独的文件中(让我们称之为game.js),与游戏引擎分开(让我们称之为engine.js).
我已经读过全局变量在JS中使用比局部变量慢.因此,在game.js中,我创建了一个包含所有游戏特定变量的全局变量.在engine.js中,我将此全局对象复制到局部变量,在那里我删除了这个全局对象.
这很有效.但我知道分配对象只会传递对这些对象的引用.
因此我的问题是:表现是否就好像我已经将所有变量直接声明为engine.js中的局部变量,因为我在初始化结束时删除了全局对象,或者它会更慢,就好像我的engine.js中的局部变量只是对全局对象的引用?
我可以将所有变量声明为engine.js中的本地变量,但是如果以后我想制作其他地图/游戏,那么将我的特定地图分开是有用的.
例如:
game.js:
Game = function() {
this.x = 16;
this.y = 16;
this.myObject = {"test": "hello", "action": "none"};
}
game = new Game();
的engine.js:
// …
var x = game.x;
var y = game.y;
var obj = {"test": game.myObject.test, "action": game.myObject.action};
// …
在这个例子中,x,y和obj的性能是否与局部变量一样快,还是更慢?
注意:我没有真正检查全局变量和本地变量的性能之间的区别,但我认为我读到的是正确的.
希望我的问题足够清楚,而不是愚蠢:)如果你有任何想法……谢谢!
解决方法:
在现代浏览器中,局部变量和全局变量之间可能没有太大的性能差异.
但是内存消耗存在问题 – 只要页面保持打开,全局变量就会持续存在,而控制离开其范围后局部变量为garbage collected.使用局部变量可以减少获得memory leak的机会.
更新
评论主题中冗长的讨论促使我编写了一个测试脚本来衡量对比全局和本地范围访问的执行速度差异.
最初似乎没有差异,结果各不相同,没有特别偏好的一方或另一方.然而,@ DaveNewton提供了一个反例,它一致地表明局部变量的性能提高了一个数量级.
Firefox 7
Milliseconds used for 20000 global accesses: 132
Milliseconds used for 20000 local accesses: 159
Internet Explorer 9
Milliseconds used for 20000 global accesses: 1750
Milliseconds used for 20000 local accesses: 1699
谷歌Chrome 14
Milliseconds used for 20000 global accesses: 46
Milliseconds used for 20000 local accesses: 55
测试脚本本身
<html>
<head>
<script type="text/javascript">
function t() {
var test = function () {}
test.issue = new String("hello");
var start = new Date().getTime();
(function() {
(function() {
(function() {
(function() {
(function() {
(function() {
(function() {
var a = document.getElementById("a");
for (var i = 0; i < 20000; i++) {
a.innerHTML = test.issue.toString();
}
a = null;
})();
})();
})();
})();
})();
})();
})();
var stop = new Date().getTime();
document.getElementById("a").innerHTML = "Milliseconds used for 20000 global accesses: " + (stop - start);
var start = new Date().getTime();
(function() {
(function() {
(function() {
(function() {
(function() {
(function() {
(function() {
var c = document.getElementById("c");
var testx = {};
testx.issue = new String("hello");
for (var i = 0; i < 20000; i++) {
c.innerHTML = testx.issue.toString();
}
c = null;
})();
})();
})();
})();
})();
})();
})();
var stop = new Date().getTime();
document.getElementById("c").innerHTML = "Milliseconds used for 20000 local accesses: " + (stop - start);
}
window.onload = function () {
document.getElementById('b').onclick = t;
}
</script>
</head>
<body>
<div align="center"><button id="b">Run Test</button></div>
<div id="a"></div>
<div id="c"></div>
</body>
</html>
一个反例,展示了对局部变量的更快访问.
var t0 = new Date();
var i;
for (i=0; i<10000000; i++);
var t1 = new Date();
function count() { for (var i=0; i<10000000; i++); }
var t2 = new Date();
count();
var t3 = new Date();
d = document;
d.write('Without local variables = ', t1-t0, '<br />');
d.write('With local variables = ', t3-t2, '<br />');
内容总结
以上是互联网集市为您收集整理的Javascript:对象副本,全局变量和性能全部内容,希望文章能够帮你解决Javascript:对象副本,全局变量和性能所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。