【问题标题】:Multiple conditions vs. multiple statements多个条件与多个语句
【发布时间】:2016-03-17 13:58:01
【问题描述】:

这些代码示例在性能方面是否存在差异?

if (this.game.physics.arcade.overlap(this.player, this.barels) && (this.game.time.now - this.srdicka.timecheck > this.srdicka.frequency) || (this.player.position.y > this.game.height + 100)) {
  this.damage(1);
}

if (this.game.physics.arcade.overlap(this.player, this.barels) && (this.game.time.now - this.srdicka.timecheck > this.srdicka.frequency)) {
  this.damage(1);
}

if (this.player.position.y > this.game.height + 100) {
  this.damage(1);
}

我知道两者都可以正常工作,但我不确定哪个更好。

【问题讨论】:

  • 取决于逻辑,你应该关心如果两个检查都为真,那么第二个例子会造成2次伤害
  • 是的,如果等式只有一侧为真,则通过或通过,因此第一个会更快
  • 在这种特殊情况下(和大多数情况下),我认为性能差异可以忽略不计。也就是说,在我有多个 if 条件的情况下,我会努力争取可读性。
  • @lux 如果这是通过游戏循环运行的,因为它似乎是预期的,尽管性能会微不足道,它会发生几次,并且只是为了了解它,你应该知道一个或不如果第一个条件为真,则不完全评估
  • @johnny5 所以从其他人的说法来看,在我不需要同时处理两个条件都为真的游戏循环中,最好在一个语句中使用多个条件乙>。如果我误解了您的回答,请回复我。谢谢:)

标签: javascript phaser-framework statements multiple-conditions ifs


【解决方案1】:

是的。在第一个版本中,这...

(this.player.position.y > this.game.height + 100)

...只有在这个...时才会被评估

this.game.physics.arcade.overlap(this.player, this.barels) &&
(this.game.time.now - this.srdicka.timecheck > this.srdicka.frequency)

...计算为false。在第二个版本中,无论如何都会对其进行评估。因此,如果第二个示例中的第二个 if 中的表达式会很昂贵,那么它可能会产生重大影响。正如 cmets 中所述,您的两个示例之间的差异也改变了逻辑。在这种情况下,将第二个语句设为 else if 将保留原始逻辑。

这是一个example,它说明了性能和逻辑与直接影响和副作用的差异。运行它并查看控制台。

【讨论】:

  • 感谢您的回答。 :)
【解决方案2】:

我认为最好将所有内容合二为一,而不是一分为二。原因是你会点击一个 if 语句而不是两个。

为了便于阅读,我将对第一个进行更改并将其格式化为以下格式:

if (this.game.physics.arcade.overlap(this.player, this.barels)
                && (this.game.time.now - this.srdicka.timecheck > this.srdicka.frequency)
                || (this.player.position.y > this.game.height + 100))
            {
                this.damage(1);
            }

【讨论】:

  • 想想不止一次地使用这些 if 语句,它们太可怕了!我称这些为火车残骸。
【解决方案3】:

您不仅可以为可读性划分条件,还可以为重用性、可维护性和可用性划分条件:

if (overlap() && frequency() || position())
{
    this.damage(1);
}

function frequency(){
    return this.game.time.now - this.srdicka.timecheck > this.srdicka.frequency;
}

function overlap(){
    return this.game.physics.arcade.overlap(this.player, this.barels);
}

function position(){
    return this.player.position.y > this.game.height + 100;
}

如果您的编译器运行良好,就像现代浏览器中的任何情况一样,您只需要关心&&|| 符号即可提高性能。 || 只会评估左侧,如果为假,它将继续评估右侧。巧妙地使用它们。

【讨论】:

    猜你喜欢
    • 2016-06-03
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多