哪一个更高性能:使用Swift Array.contains函数或使用if(.. || .. || ..)进行检查?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哪一个更高性能:使用Swift Array.contains函数或使用if(.. || .. || ..)进行检查?相关的知识,希望对你有一定的参考价值。

在我们的Swift代码中,当我们想要检查foo是否是特定值时,我们经常写这个:

if [kConstantOne, kConstant2, kConstant3].contains(foo) {...}

我想知道这是如何比较,表现明智,与正常的if声明,你比较值与||

if kConstantOne == foo || kConstant2 == foo || kConstant3 == foo {...}

编译器是否优化了此语句,还是有效分配,实例化和循环以检查相等性的数组?

编写这些简单的if语句是一种更简单,更有趣的方式,但如果会产生重大的性能影响,我会严重怀疑它,我们应该尽量避免它。

编辑:单独使用它不会产生任何影响,但我更想知道当它是更大算法的一部分时会发生什么。当你的代码命中这个语句或其他类似语句几千次,分配和初始化一个数组并使用contains函数进行相等性检查时会发生什么。

答案

如果您担心性能影响,探索此问题的唯一方法是在您认为会对性能产生影响的代码中对其进行基准测试。虽然我们可以对当前的编译器实现细节做一些推理,但是没有办法将它们转换为回答“显着性能影响”的问题,并且在很多情况下你的直觉是错误的(map比大多数简单的for循环快一点)在你阅读map的实现之前,这是违反直觉的;但这是一个非常微小的差异)。

清楚地写出代码来说出你的意思。第一个做到了。

有可能if语句比contains略快,并允许contains没有的一些编译器优化(可能会或可能不会实际发生)。它肯定不会创建一个临时数组或类似的东西。然而,无论如何,这对于如此微小的阵列来说几乎是无法测量的。如果这是一个被称为几千万次的内循环的一部分,我有一些方法我会探索优化它(这看起来不像这些;我首先关注的是摆脱它==如果这些不是整数)。如果这被称为少于一百万次,那么你更有可能意外地伤害性能,而不是像这样通过微优化来帮助它。你肯定会损害可维护性。

以上是关于哪一个更高性能:使用Swift Array.contains函数或使用if(.. || .. || ..)进行检查?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 跨平台开发,该用 Flutter 还是 Swift?

哪一个对 IPC 性能的影响更大?上下文切换或进程数?

图标字体与SVG,哪一个更适合与颤动一起使用?

Swift 5将使用UTF-8作为首选字符串编码

Swift 常量:结构或枚举

学会Python之后更适合做哪方面的工作?