与Java或Python相比,似乎有很多关于C或C ++的各种速度优劣的讨论,但是我很少看到Objective-C。就语言表现而言,它大致在哪里?
与Java或Python相比,似乎有很多关于C或C ++的各种速度优劣的讨论,但是我很少看到Objective-C。就语言表现而言,它大致在哪里?
Answers:
与C ++不同,Objective-C被设计为C的干净超集。我使用的少数Objective-C编译器被称为C编译器,但也可以处理Objective-C。
因此,可以安全地假设在代码生成级别,C和Objective-C是等效的。
第一个区别出现在OOP ABI中,也称为“后期方法绑定”。就像在C ++中一样,Objective-C依赖于在运行时遍历的编译器生成的函数指针表。
但是,与C ++不同,绑定方法更具“动态性”,并且可以在id
任何地方促进超类的使用,从理论上讲,它比C ++慢一些。实际上,这种差异远低于可测量的范围。
最后,最重要的性能问题是所用库的质量。由于Objective-C仅在Apple系统中真正流行,因此有理由假设您将其与Cocoa一起使用。这是一组很好的高级库。在大多数情况下,您可以将繁琐的工作留给他们,因此您的代码不必太快,或者如果进行繁琐的工作,那么它很可能是静态的代码库,与纯C类似。
TL; DR:最重要的是C和C ++语言。如果性能不好,请检查算法。就像任何严肃的语言一样。
Objective-C比C / C ++慢。原因是Objective-C的运行时,它在运行时以与Smalltalk相同的方式动态地调度方法查找,从该方法继承了此执行模型。与在C / C ++中调用函数相反(在C / C ++中,函数地址是在编译时确定的),在运行时调度所有方法称为“真实消息发送”(C ++虚拟方法除外)。但是我不能说Objective-C的速度要慢多少。ASAIK由于性能下降而仅用于应用程序开发。
正如Oliver所说,Obj-C和C / C ++之间的基本速度差异是由于动态方法分派所致。
本文在Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946中介绍了此开销
当您确定方法分派(即objc_msgSend)是限制因素时,它也提供了一个很好的技巧来优化您的Obj-C代码-获得一次指向该函数的指针,并多次使用它来调用该函数。Obj-C运行时会自动执行此优化,所以它不会有太大帮助。
请注意,动态方法分派的实际成本是由于缓存未命中,因为它破坏了CPU分支预测。这些很难描述,可能是上面引用的代码无法衡量真实的缓存未命中成本。
一些更有用的讨论在这里:http : //www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605
底线:语言之间的最大差异在于您的算法。除此之外,由于动态或虚拟方法分派,Obj-C,C和C ++之间存在根本的速度差异。第二点似乎并不大。如果您可以通过分析找到热点,则上面的文章提供了优化它的技巧,由于CPU缓存未命中,这可能很困难。