在展开swift可选类型时,性能命中(如果有的话)是什么?

dev*_*eak 3 swift

如果我有var x: CustomType?,使用展开时性能会受到什么打击x!?写作有以下意思:

if let x1 = x {
    f(x1)
    f2(x1)
} 
Run Code Online (Sandbox Code Playgroud)

或者我可以写出相同的表现:

f(x!)
f2(x!)
Run Code Online (Sandbox Code Playgroud)

注意:我知道在第一种情况下检查选项是否有效,但如果我知道此选项在此代码中100%有效,该怎么办?

Air*_*ity 6

除非你正在编译-Ounchecked(并且不这样做),否则它们最终会非常相似,因为运行时仍然会检查可选项是否包含值(因为如果强制解包nil值,则得到一个运行时断言,它不仅仅访问内存,就好像它不是nil).可能带来if let优势的是你正在告诉编译器更多关于你要做什么的事情,这使它有更好的机会来优化它.

然而,不要担心这个问题,而是考虑所有的想法,想知道哪个更快,更重要的是,你总是花时间来推断它是否可以安全使用,!因为你的变量肯定可能几乎肯定不会是零(哎呀,除了那一次),并把它更好地使用.

而是把时间花在优化实际重要的东西上.O(n^2)当你可以做它们时,寻找你正在做的事情O(n log n).考虑缓存局部性.考虑在运行时在编译时执行更多操作.不要担心可能会花费你一条CPU指令而不是更安全的替代方案.

  • 感谢您的回复和建议,我很感激这些,但作为一名在该领域拥有长期 XP 的 C++ 开发人员,我想熟悉所有细节,这只是一种习惯......而且我认为这是一个很好的习惯。在优化这个之前,你必须考虑很多事情 - 我同意你的观点,但我只想知道幕后发生了什么。 (2认同)