据我所知,swift 中的值类型可以更高效,因为它们存储在堆栈而不是堆中。但是,如果您对 DispatchQueue.sync
或 DispatchQueue.async
进行多次调用,这是否会因为闭包存储在堆上而使值类型的优势消失?
最佳答案
As I understand it value types in swift can be more performant because they are stored on the stack as opposed to the heap.
有时。通常不是。例如,String
包括堆分配存储。许多值类型都有隐藏的堆分配存储空间(这实际上真的很常见)。因此,对于许多类型,您可能无法获得预期的性能提升,但在许多情况下,您也不会因闭包而失去性能提升。
值类型是关于行为的,而不是性能(当然你需要区分 value types and value semantics ,它们是不同的,并且会对性能产生影响)。所以关于值类型和 DispatchQueue
的好处是您知道您不会意外地修改多个队列上的值,因为您知道您有自己的独立副本。当您支付分配到队列的开销时(经过优化,但仍然不便宜),复制值类型的额外成本可能不是主要问题。
根据我的经验,很难推断 Swift 的性能,尤其是由于写时复制优化。但明显的“值类型”可能具有隐藏的内部引用类型这一事实也使性能分析变得非常棘手。您通常必须了解并依赖可能发生变化的内部细节。要开始了解 Swift 性能,您绝对应该观看 Understand Swift Performance (可能有几次)。如果您要从 C++ 中汲取任何性能直觉,那么您必须为 Swift 抛弃几乎所有这些直觉。它只是做了很多不同的事情。
关于swift - swift 中的并行编程是否消除了值类型优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41290756/