我确定我的术语已经关闭,所以这是一个例子:
call和callvirt指令(非常类似于C++方法和虚方法).尽管C#中的几乎所有方法调用都会变成callvirt(由于语言错误),但JIT编译器能够优化大多数返回call指令,然后(如果有价值)也可以内联它们.objc_msgsend每次调用方法时都会传递一个消息对象,它是动态调度的一种形式,永远不能内联.阅读Swift 函数的语言规范,我不知道Swift是否使用与Objective-C相同的消息传递系统或其他不同的消息传递系统.
ipm*_*mcc 11
有时是,有时没有.如果你有纯swift代码,并且没有通过@objc装饰将你的类/协议暴露给Objective-C ,那么看起来不会通过pure-swift方法调用来调度它objc_msgSend,但是在其他情况下它们是.如果您的swift对象采用的协议是在Objective-C中声明的,或者如果使用swift协议进行修饰@objc,那么通过调度方法调用协议方法,甚至从swift对象到其他swift对象objc_msgSend.
文档目前有点薄; 我确定还有其他的细微差别......但从经验上讲(即我已经尝试过了)一些快速的方法调用会通过objc_msgSend而其他方法则不会.我认为获得最佳性能将取决于保持您的代码尽可能多的纯粹swift并尽可能少地跨越Obj-C/swift边界,并通过瓶颈接口/协议,以限制快速调用的数量必须动态调度.
我相信迟早会出现更详细的文档.
| 归档时间: |
|
| 查看次数: |
2485 次 |
| 最近记录: |