定义变量是否比在JS中覆盖变量使用更多资源?

时间:2016-04-23 02:37:36

标签: javascript

如果您计划使用会多次覆盖变量值的函数,那么在覆盖行中使用BsonSerializer.RegisterSerializationProvider(new BsonDecimalSerializer()); 会不会对性能造成影响?

例如,

选项1

var

选项2

var currentTile;
function setCurrentTile(index) {
    currentTile = $scope.tiles[index];
}

从历史上看,我一直在使用选项#1,因为在我的代码中减少function setCurrentTile(index) { var currentTile = $scope.tiles[index]; } 的数量似乎很直观。但也许它没有任何区别,使用较不冗长的方法更为理想。

有人可以提供建议吗?

更新背景

我们生成一个如下所示的长数组

var

然后遍历它,将值传递给function prepGame() { // GENERATE TILE PATTERN var tiles = []; var times = 30; for ( var i = 0; i < times; i++ ) { tiles.push(Math.floor(Math.random() * 9)); } $scope.tiles = tiles; } 。因此,setCurrentTile(index)option 1将被调用30次。

4 个答案:

答案 0 :(得分:5)

[爱的]过早的优化是万恶之源。

您应该根据程序的正确性来调整变量的范围,而不是猜测性能或内存利用率。虽然在学术上真实地认为局部变量将比全局变量更快地得到解决,但我会坦率地震惊来发现一个真正的程序,其中两者之间有足够的差异供人类用户注意。本地变量和全局变量之间的内存使用量应该几乎没有差别。 (通常情况下,这根本没有区别,因为变量是一个变量,但如果对象的多个实例存在,实例对象的变量显然可能会重复)

然而,如果程序产生不正确的结果, 一般来说,global variables are bad因为它们使程序状态更难以推理。当然,这并不是说他们永远不合适。使用有意义的范围,忘记性能,直到您证明您有一个真实的,用户明显的问题

答案 1 :(得分:0)

在javascript中我们有功能级别范围和全局范围。我们可以通过在函数中包装代码来使变量本地化。首先在本地范围内搜索变量,如果在本地范围内找不到它们,那么浏览器会尝试在外部范围内找到它们,或者如果在全局范围内没有其他范围,那么很明显如果找到变量在本地范围内,如果它存在于函数之外,那么访问它将花费更少的时间然后访问它...

所以在我看来,如果你在一个函数中使用变量,那么你将有两个优势......

  1. 全局命名空间不会受到污染..
  2. 访问当前范围内存在的变量的时间总是快于访问它们,如果它们在当前范围之外声明...

答案 2 :(得分:0)

选项1

  1. Javascript需要在内部范围内进行搜索,首先搜索setVarible
  2. 如果不存在,请在外部范围内搜索。当Javascript匹配变量时,设置给定值。

  3. 最后,它完成的setCurrentTile方法的执行上下文,声明的var变量被放入垃圾收集器然后被销毁。

  4. 如果您注意到,就速度而言,必须在内部范围内搜索变量定义以及外部范围。就系统内存而言,变量为keeping alive。如果这个方法被调用了30次,这个过程将被执行并且对于每个函数调用,将在内部和外部范围内搜索应用程序的速度

    选项2

    它在函数的执行上下文中创建的变量currentTitle,其值仅存在于此执行中。此方法以速度方式保存,但会创建并销毁变量currentTitle的30倍。这意味着垃圾收集器也将被调用30次。 我不是Javascript专家,我不太了解垃圾收集器,但我认为关于使用更多资源的行为将取决于运行Javascript的引擎以及如何管理垃圾收集器过程

    更多信息here

答案 3 :(得分:0)

穆罕默德很好地​​解决了范围问题,所以我会跟进一个测试表现的建议。 JS在控制台命名空间中有一个方法,允许进行性能测试。它是非标准的,因此它只应用于测试。它可能看起来像:

var currentTile;
console.time("currentTile");
function setCurrentTile(index) {
    currentTile = $scope.tiles[index];
}
console.time("currentTile");

为了进一步提高性能,您可以设置如下的循环长度变量:

for(var i =0, times = 30; i < times; i++) {

}