【问题标题】:Returning Javascript Variables and Performance返回 Javascript 变量和性能
【发布时间】:2023-03-15 15:53:01
【问题描述】:

我目前将脚本所需的所有元素都缓存在一个类似于此的全局对象中:

var MainObject={
   $El1 : $('#element1'), 
   $El2 : $('#element2')
   };

在我的方法中,我可以直接访问对象。

method1:function(){
   MainObject.$El1 // DO SOMETHING WITH THIS ELEMENT
}, ...

所以,我有 2 个问题。

我听说局部变量是最快的。像这样写我的方法会更好吗?

method1:function(){
    var $El1=MainObject.$El1; 
    $El1 // DO SOMETHING WITH THIS ELEMENT
}, ...

如果是这样的话……

如果我的脚本中有 许多 引用这些元素的方法(这些元素很快会变成很多行),那么压缩它们的最佳方法是什么?

method1:function(){
   var $El1=MainObject.$El1,
       $El2=MainObject.$El1,
       $El3=MainObject.$El1,
       $El4=MainObject.$El1;

   $El1 // DO SOMETHING WITH THIS ELEMENT
},

method2:function(){
   var $El1=MainObject.$El1,
       $El2=MainObject.$El1,
       $El3=MainObject.$El1,
       $El4=MainObject.$El1;

   $El1 // DO SOMETHING WITH THIS ELEMENT
},

method3:function(){
   var $El1=MainObject.$El1,
       $El2=MainObject.$El1,
       $El3=MainObject.$El1,
       $El4=MainObject.$El1;

   $El1 // DO SOMETHING WITH THIS ELEMENT
},

谢谢!

【问题讨论】:

  • 不,实际上你离正轨很远,这是不可能的:-)
  • 什么是不可能的?你能提供更多信息吗?
  • 创建一个在不同范围内声明变量的函数。
  • hmmm,那么是否有更好的方法可以在不同的方法中压缩许多变量声明?
  • @Aaron 如果你想提高性能(不是说改进会很重要),请确保使用严格的语言。在严格的语言中,所有嵌套环境都是静态的,这意味着引擎肯定知道MainObject 是一个全局变量,这会导致访问速度更快。

标签: javascript jquery variables scope


【解决方案1】:

在您测量出您在某个需要解决的特定方法中确实存在性能问题之前添加过早优化的代码很少,如果有的话,是一个好主意。它只是增加了更多的代码行,编写时间更长,而且通常不能解决任何实际问题。

然后,当您确实有性能问题需要解决时,您需要仔细衡量以找出该方法的哪个方面真正需要时间。


是的,局部变量比全局变量更快(在全局范围之前搜索局部范围以解析变量名)。是的,MainObject.$EL1 中的多个引用比单个本地引用要慢。


这是我的一般经验法则。如果您只是在一个方法中使用类似MainObject.$EL1 的东西一次或两次,那么将其缓存在局部变量中几乎没有什么好处。如果您使用它三次或更多次,那么将其缓存在本地以防止所有额外的查找是很有意义的。我通常会在 javascript 和 C++ 中做同样的事情。

如果您有一个实际的性能问题,并且想要更快地完成某些事情,那么您对性能问题主要原因的第一直觉很少是正确的。因此,分析并找出真正花费最多时间的内容是很有意义的。然后,当您进行更改时,您需要一种方法来衡量更改的影响,以了解您在添加更多代码时实际上正在发挥作用。

【讨论】:

  • 感谢您提出问题! :p 是的,这些对象在方法中被多次使用,所以我想缓存它们。脚本已经完成,我现在正在优化。我正在尝试减少行数,这是我认为可以做到的地方。您知道是否有任何方法可以在多种方法中浓缩这些内容?
  • @Aaron - 如果您只是想压缩它们的可读性影响,那么您可以使用更长的一行而不是多行。但是,没有任何其他快速方法可以将它们全部放入像这样的局部变量中。
  • 这里有个问题...如果我要包含类似的内容: var allVars=script.getVars();在每个方法中(声明在哪里)?然后在 getVars 方法中,检索所有元素并将它们作为对象返回?既然我在方法本身中声明了 allVars,那么返回的对象内容也会是本地的吗?代码正在运行,但是(回到我原来的问题,这是不可能的,但现在正在运行) - 这些真的是本地/缓存到方法吗?
  • @Aaron - 您将它们放入局部变量中,但是您需要额外查找来获取对象和相应的属性,并且您将拥有方法调用的开销.最好将原件保存在全局对象中,然后将全局对象重新分配给本地变量。如果您真的很在意,那么您将不得不在几个浏览器中对此进行基准测试(可能在 jsPerf 中),以了解您是让事情变得更快还是更慢。
  • @Aaron - 我在之前的评论中添加了一个您可能错过的想法。
【解决方案2】:

这个getElements() 函数是不可能的

局部变量以作用域结束..一旦作用域结束,变量也消失了..

您应该阅读这些出色的帖子JavaScript Variable ScopeVariable Scope

【讨论】:

  • 好的,所以返回变量是不可能的。这是一个很长的镜头,但我只是想知道是否有更好的方法来压缩每个方法顶部的 var 声明?
  • 为什么不创建一个本地对象,其中包含您需要的所有引用?这是完成任务的最快方法.. 它们只有两条路径可以让您进入内存,一条通往本地 obj,另一条通往您的 var.. 这样localObj.myVar
  • 不会创建/引用本地对象会比引用本地变量慢并且长度大致相同?我不确定这将如何帮助减少不同方法中的重复声明。
【解决方案3】:

局部变量更快,但不是很多。您需要在函数内多次访问变量,以弥补首先将值复制到局部变量所需的时间。如果你只使用一次,你只会浪费那段时间。

这是一个性能测试:http://jsperf.com/variables-vs-properties-2

您不仅可以看到在对象中查找属性和使用局部变量之间没有太大区别,而且您还可以看到您必须这样做数百万次才能发现差异。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 2019-05-03
    • 2011-08-14
    • 2015-02-05
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多