Swift Micro优化:多个if语句,如果不是,则不会发生

时间:2016-09-28 04:34:21

标签: swift if-statement optimization

如果这些技术中的哪一项导致更快的执行以及为什么会有差异?

使用if语句只允许计算numberOnePlusOne一次。

func test(numberOne:Int, numberTwo:Int) {
    if numberOne == numberTwo {
      return
    }
    let numberOnePlusOne = numberOne + 1
    if numberOnePlusOne == numberTwo && numberOnePlusOne < numberTwo {
      return
    } else {
      return
    }
}

因此,如果使用if if else是有益的话,我会假设这样做的好处是告诉编译器块不能没有操作就会掉线。

func test(numberOne:Int, numberTwo:Int) {
    if numberOne == numberTwo {
      return
    } else if numberOne + 1 == numberTwo && numberOne + 1 < numberTwo {
      return
    } else {
      return
    }
}

2 个答案:

答案 0 :(得分:0)

  

如果这些技术中的哪一项导致更快的执行以及为什么会有差异?

如果您认为LLVM字节码是一种中间语言,其转换将导致机器特定的机器语言(例如编译为x86或ARM机器代码)或行为(解释),那么应该清楚这个答案:

某些机器在某些方面比其他机器更快。一个人可能在分支方面更快,而另一个可能将分支预测电路用于额外的高速缓存存储器,而不是。

基本上,您的问题的问题在于您要求合成基准测试,因此您可以编写针对过早优化而定制的代码。相反,您应该编写代码以便轻松维护,并使用分析器来识别最重要的瓶颈。根据它进行优化,然后再次进行配置以确保您正确完成。找到下一个瓶颈,冲洗,重复和起泡。这种方法有很多好处:

  • 最重要的是,您将花费更少的时间来实施最佳优化;这是优化你的时间。
  • 您不会通过微优化猜测来推动更有效的优化。一些优化措施可以阻止其他人......
  • 您的代码将更加清晰。

我建议您尽可能优化每个系统。在这种情况下,我非常怀疑这可能是任何实际代码中的一个重要瓶颈,我相信基于LLVM的高质量编译器可以优化这两个到同一个机器代码。考虑它可以提前执行死代码分析,

答案 1 :(得分:0)

你绝对是绝对错误的。您正在寻找微观优化。微优化有时可以节省纳秒,但大部分时间它们都没有。真正的程序员会看到可以节省微秒的真正优化:-)或者有时可以区分软件是否可用。

你真的,真的需要读一本关于斯威夫特的书。你的功能实际上做了什么?乍一看,它似乎什么也没做,可以优化掉。仔细看看,如果numberOne + 1溢出那么它将会崩溃,因为这是语言的定义方式,除非numberOne == numberTwo。所以任何体面的优化Swift编译器都会将其变成类似

的东西
if numberOne != numberTwo {
    check_overflow (numberOne + 1); 
}

优化的第一条规则是:如果你没有测量它,那就不要优化它。因为没有测量意味着你不知道你在做什么,优化是否有效,以及是否需要优化。

优化的第二条规则是:编译器工程师在其编译器中构建优化,以帮助实际有用的代码。它们识别可以优化的代码模式。像你这样的无意义代码不会属于任何这些模式,因此不会得到优化。