我工作上的一个项目,该项目需要一些非常复杂的JavaScript处理。这包括一个很大的嵌套 if-elses在不少地方。我有一般的照顾,以优化JavaScript code尽可能通过阅读其他的技巧堆溢出,但我想知道,如果下列两个结构将使任何差别条款的速度:

if(some_condition) {
    // process
    return ;
}

// Continue the else condition here

vs

if(some_condition) {
    // Process
}

else {
   // The 'else' condition...
}
有帮助吗?

解决方案

我总是选择第一种方法。更容易阅读,减少缩进。就执行速度而言,这将取决于实现,但我希望它们都是相同的。

其他提示

在许多语言中,反转if语句以减少嵌套是一种常见做法或使用前置条件

在代码中嵌套较少可以提高代码的可读性和可维护性。

"个人资料,不要猜测!"

  1. 你把车前马(维护人类的王牌机速)
  2. 你应该推动优化的努力, 测量, ,这意味着

    • 你应该时间执行自己;它将明显不同,在不同的浏览器和版本
    • 你应该只优化速度的 热点 你的应用程序(见第1点)

性能没有任何差异我会推荐第二个可维护性示例。一般来说,最好只有一个例程的退出点。它有助于调试和理解。

在排除无效情况时,我将使用第一种方法。

EG。在进行一些验证时使用第一种方法,如果任何验证失败则返回。如果任何先决条件失败,那就没有必要继续下去了。 Martin fowler在他的重构一书中提到了同样的事情。他称之为<!>“;用Guard子句替换条件<!>”;它确实可以使代码易于理解。

这是一个java示例。

  public void debitAccount(Account account, BigDecimal amount) {
    if(account.user == getCurrentUser()) {
      if(account.balance > amount) {
           account.balance = account.balance - amount
       } else {
          //return or throw exception
       }
    } else {
        //return or throw exception
    }
  }

VS

 public void debitAccount(Account account, BigDecimal amount) {
    if(account.user != getCurrentUser()) return //or error
    if(account.balance < amount) return //or error
    account.balance = account.balance - amount    
}

可能稍微,但我不认为它是可测量的,除非函数的其余部分涉及<!> quot; heavy <!> quot; (并且因为我假设返回会产生相同的结果,所以是多余的)js调用。

作为旁注,我认为这是不必要的微优化,您应该在其他地方寻找性能改进,即通过Chrome的开发人员工具或Firebug for Firefox(或类似工具)配置脚本并查找慢/长时间运行调用/功能。

虽然它取决于正在运行的浏览器的JavaScript实现,但它们之间应该没有任何显着差异(就速度而言)。

第二种形式是优选的,因为打破流程不是一个好的编程习惯。另外在组装时考虑一下,无论评估如何,总是评估跳转指令(微操作)。

自己测试一下。如果这个JavaScript在浏览器中运行,它几乎肯定取决于浏览器的JavaScript解析引擎。

我的理解是,因为你使用if条件进行分支,所以不会产生任何影响。因此,如果some_condition为true,则即使没有返回,也不会触及else部分。

假设return需要1ms而不是嵌套if需要0.1ms(反之亦然)。

很难想象其中任何一个几乎都那么慢。

现在,你每秒做的次数超过100次吗?

如果是这样,也许你应该关心。

当只有一个if..else 表现几乎相同时并没关系。使用在您的情况下最好的可读性。但是使用return来嵌套语句是最高效的if...elsecase switch

相比

根据我的经验,这取决于你正在检查的条件。

  1. if .. return如果你检查一些布尔条件(可能是设置)会使整个后面的代码根本无法执行,那么它很好并且易于阅读。

  2. 如果您希望某个值是两个(或更多)可能值中的任何一个并且您希望为这两种情况执行不同的代码,则
  3. if .. else更容易阅读。这意味着两个可能的值代表具有相同可解释值的条件,因此应该写在同一逻辑层面上。

在我看来,对于上述情况,返回和其他方面相同,但一般if-elseif()return;是非常不同的。当您想要从当前范围移动到父范围时,可以使用return语句,而在<=>的情况下,您可以在同一范围内检查if-else。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top