如果这些技术中的哪一项导致更快的执行以及为什么会有差异?
使用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
}
}
答案 0 :(得分:0)
如果这些技术中的哪一项导致更快的执行以及为什么会有差异?
如果您认为LLVM字节码是一种中间语言,其转换将导致机器特定的机器语言(例如编译为x86或ARM机器代码)或行为(解释),那么应该清楚这个答案:
某些机器在某些方面比其他机器更快。一个人可能在分支方面更快,而另一个可能将分支预测电路用于额外的高速缓存存储器,而不是。
基本上,您的问题的问题在于您要求合成基准测试,因此您可以编写针对过早优化而定制的代码。相反,您应该编写代码以便轻松维护,并使用分析器来识别最重要的瓶颈。根据它进行优化,然后再次进行配置以确保您正确完成。找到下一个瓶颈,冲洗,重复和起泡。这种方法有很多好处:
我建议您尽可能优化每个系统。在这种情况下,我非常怀疑这可能是任何实际代码中的一个重要瓶颈,我相信基于LLVM的高质量编译器可以优化这两个到同一个机器代码。考虑它可以提前执行死代码分析,。。
答案 1 :(得分:0)
你绝对是绝对错误的。您正在寻找微观优化。微优化有时可以节省纳秒,但大部分时间它们都没有。真正的程序员会看到可以节省微秒的真正优化:-)或者有时可以区分软件是否可用。
你真的,真的需要读一本关于斯威夫特的书。你的功能实际上做了什么?乍一看,它似乎什么也没做,可以优化掉。仔细看看,如果numberOne + 1溢出那么它将会崩溃,因为这是语言的定义方式,除非numberOne == numberTwo。所以任何体面的优化Swift编译器都会将其变成类似
的东西if numberOne != numberTwo {
check_overflow (numberOne + 1);
}
优化的第一条规则是:如果你没有测量它,那就不要优化它。因为没有测量意味着你不知道你在做什么,优化是否有效,以及是否需要优化。
优化的第二条规则是:编译器工程师在其编译器中构建优化,以帮助实际有用的代码。它们识别可以优化的代码模式。像你这样的无意义代码不会属于任何这些模式,因此不会得到优化。