我们的代码库有大约800个函数返回AnyPublisher<Type, Error>,因为我想使用特定于语言的功能,我找不到任何资源或参考来比较使用any Publisher或some Publisher作为替代品的性能或缺点。有没有什么有效的方法可以最终自己测试呢?
AnyPublisher<Type, Error>
any Publisher
some Publisher
lawou6xi1#
对于任何性能问题,最好的经验法则是“用分析器试试看”。如果你怀疑有性能问题,那么在仪器中运行一些测试。如果不深入研究苹果是如何实现any Publisher和AnyPublisher的,一般来说很难回答你的问题。根据我的经验,这种类型擦除涉及到,抽象地说,把一个完全类型化的实体放在一个“盒子”中,也就是说,把它 Package 在一个间接层中。任何想要访问盒子里的东西的代码都必须经过这个间接层,这个额外的间接层可能会在调用时间和内存的绝对性能方面有(小)成本。相比之下,使用some Publisher最常见的情况是当你有一个泛型函数:func doSomething<T: somePublisher>(firstArg: T)。在这种情况下,编译器将为每种类型生成一个特定版本的doSomething。我希望没有额外的间接层,所以调用时间不应该受到影响。但是你的代码会更大。你自己测试它的最“有效”的方法是使用仪器中的broilers。你一定会在内存大小和运行速度之间进行权衡......这是一个经典的计算机科学问题。值得一提的是,苹果自己也警告过使用存在性(即any <Protocol>)可能会带来的性能损失。他们的建议和你在这里得到的一样--如果你担心它,就使用分析器。
AnyPublisher
func doSomething<T: somePublisher>(firstArg: T)
doSomething
any <Protocol>
1条答案
按热度按时间lawou6xi1#
对于任何性能问题,最好的经验法则是“用分析器试试看”。如果你怀疑有性能问题,那么在仪器中运行一些测试。
如果不深入研究苹果是如何实现
any Publisher
和AnyPublisher
的,一般来说很难回答你的问题。根据我的经验,这种类型擦除涉及到,抽象地说,把一个完全类型化的实体放在一个“盒子”中,也就是说,把它 Package 在一个间接层中。任何想要访问盒子里的东西的代码都必须经过这个间接层,这个额外的间接层可能会在调用时间和内存的绝对性能方面有(小)成本。
相比之下,使用
some Publisher
最常见的情况是当你有一个泛型函数:func doSomething<T: somePublisher>(firstArg: T)
。在这种情况下,编译器将为每种类型生成一个特定版本的doSomething
。我希望没有额外的间接层,所以调用时间不应该受到影响。但是你的代码会更大。你自己测试它的最“有效”的方法是使用仪器中的broilers。你一定会在内存大小和运行速度之间进行权衡......这是一个经典的计算机科学问题。
值得一提的是,苹果自己也警告过使用存在性(即
any <Protocol>
)可能会带来的性能损失。他们的建议和你在这里得到的一样--如果你担心它,就使用分析器。