Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:对象复制、全局变量和性能_Javascript_Performance_Global Variables_Local Variables - Fatal编程技术网

Javascript:对象复制、全局变量和性能

Javascript:对象复制、全局变量和性能,javascript,performance,global-variables,local-variables,Javascript,Performance,Global Variables,Local Variables,我有一个相当复杂的问题要问:) 我目前正在开发一款html5画布游戏。特定于游戏地图的变量位于单独的文件(我们称之为game.js)中,与游戏引擎(我们称之为engine.js)分离 我已经读到全局变量在JS中的使用要比局部变量慢。因此,在game.js中,我创建了一个包含所有游戏特定变量的全局变量。在engine.js中,我将这个全局对象复制到局部变量,然后删除这个全局对象 这是有效的。但我知道分配对象只传递对这些对象的引用 因此,我的问题是:当我在初始化结束时删除全局对象时,它的性能是否会像

我有一个相当复杂的问题要问:)

我目前正在开发一款html5画布游戏。特定于游戏地图的变量位于单独的文件(我们称之为game.js)中,与游戏引擎(我们称之为engine.js)分离

我已经读到全局变量在JS中的使用要比局部变量慢。因此,在game.js中,我创建了一个包含所有游戏特定变量的全局变量。在engine.js中,我将这个全局对象复制到局部变量,然后删除这个全局对象

这是有效的。但我知道分配对象只传递对这些对象的引用

因此,我的问题是:当我在初始化结束时删除全局对象时,它的性能是否会像我在engine.js中直接将所有变量声明为局部变量一样,还是会更慢,就像我在engine.js中的局部变量只是对全局对象的引用一样

我可以在engine.js中将所有变量声明为local,但是如果以后我想制作其他地图/游戏,那么将特定于地图的内容分开对我来说是很有用的

例如:

game.js:

Game = function() {
this.x = 16;
this.y = 16;
this.myObject = {"test": "hello", "action": "none"};
}
game = new Game();
engine.js: //

//

在本例中,x、y和obj的性能与局部变量一样快,还是更慢

注意:我没有真正检查全局变量和本地变量性能之间的差异,但我认为我所读到的是正确的


希望我的问题足够清楚,不要傻:)如果你有任何想法。。。谢谢

在现代浏览器中,局部变量和全局变量之间的性能差异可能不大

然而,内存消耗存在一个问题——只要页面保持打开状态,全局变量就会持续存在,而局部变量则在控件离开其作用域后持续存在。使用局部变量可以减少发生错误的机会

更新 注释线程中冗长的讨论促使我编写了一个测试脚本,以对比全局和局部范围访问来衡量执行速度的差异

起初似乎没有差别,结果也不一样,对其中一个没有具体的偏好。然而@DaveNewton提供了一个反例,该反例始终显示局部变量在数量级上的性能更好


Firefox 7

用于20000次全局访问的毫秒数:132

用于20000次本地访问的毫秒数:159

Internet Explorer 9

用于20000次全局访问的毫秒数:1750

用于20000次本地访问的毫秒数:1699

谷歌Chrome 14

用于20000次全局访问的毫秒数:46

用于20000次本地访问的毫秒数: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>

函数t(){
var test=函数(){}
test.issue=新字符串(“hello”);
var start=new Date().getTime();
(功能(){
(功能(){
(功能(){
(功能(){
(功能(){
(功能(){
(功能(){
var a=document.getElementById(“a”);
对于(变量i=0;i<20000;i++){
a、 innerHTML=test.issue.toString();
}
a=零;
})();
})();
})();
})();
})();
})();
})();
var stop=new Date().getTime();
document.getElementById(“a”).innerHTML=“用于20000次全局访问的毫秒数:”+(停止-启动);
var start=new Date().getTime();
(功能(){
(功能(){
(功能(){
(功能(){
(功能(){
(功能(){
(功能(){
var c=document.getElementById(“c”);
var testx={};
testx.issue=新字符串(“hello”);
对于(变量i=0;i<20000;i++){
c、 innerHTML=testx.issue.toString();
}
c=零;
})();
})();
})();
})();
})();
})();
})();
var stop=new Date().getTime();
document.getElementById(“c”).innerHTML=“用于20000次本地访问的毫秒数:”+(停止-启动);
}
window.onload=函数(){
document.getElementById('b')。onclick=t;
}
运行测试
反例,演示如何更快地访问局部变量。

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 />');
var t0=新日期();
var i;

对于(i=0;i您所说的性能差异的原因在于javascript将变量名称解析为它所引用的值的方式时滞是javascript查找变量的结果。当通过引用某个对象来分配某个对象时,它引用的是内存中的实际值,而不是名称

例如,假设您有一个名为
info
的javascript变量,其值为
{question:null,answer:42}

info2 = info;
您告诉javascript立即找到该值,并在引用
info2
时使用它。现在
info
info2
都指向相同的值(相同的内存地址)。您没有告诉javascript在每次使用
info2
时查找引用
info
并获取该值。这意味着您的操作方式很好,因为您只查找一次全局变量引用

请注意,javascript将仅通过引用为非常量赋值,因此:

var a = 1;
var b = a;
var a = 2;
var b === 1; // => true

var z = { a: 1 };
var y = z;
z.a = 2;
y.a === 2; // => true

原语值是常量,对象不是。

不用担心。性能不同
var a = 1;
var b = a;
var a = 2;
var b === 1; // => true

var z = { a: 1 };
var y = z;
z.a = 2;
y.a === 2; // => true