Objective-C在语言表现连续性中的何处?


20

与Java或Python相比,似乎有很多关于C或C ++的各种速度优劣的讨论,但是我很少看到Objective-C。就语言表现而言,它大致在哪里?


23
1986年-布拉德·考克斯(Brad Cox)和汤姆·洛夫(Tom Love)创建了Objective-C,宣布“这种语言具有C语言的所有存储安全性以及Smalltalk的惊人速度。” 现代历史学家怀疑这两个阅读困难。(来源
梅森·惠勒

4
它属于性能无关紧要的范围。它是与Cocoa交互的唯一受支持的语言,因此,如果您要这样做,则别无其他。对于其他任何事情,无论性能如何,我都认为这是一个糟糕的选择。
杰里·科芬

1
“性能”不是语言的特征,而是语言实现以及更重要的是用该语言编写的程序的特征。您可以在Objective-C中编写非常快的程序,也可以编写非常慢的程序。
Caleb '04

它没有令人毛骨悚然的语法,但基于当前的编译器,它并不是一种性能不好的语言,因为其性能更多地基于编译器/ vm,而不是实际的语言。
钻机

Answers:


28

与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 ++语言。如果性能不好,请检查算法。就像任何严肃的语言一样。


4
实际上,现代objective-c与现代C ++一样具有超然性。在C语言中,您可以对任意指针进行算术运算,而在ObjC中则不能。而且,由于方法查找而导致的性能差异是可以测量的:objc_msgSend的快速路径比成员函数调用重大约四倍(并且慢速路径不如快速路径快)。

11

Objective-C比C / C ++慢。原因是Objective-C的运行时,它在运行时以与Smalltalk相同的方式动态地调度方法查找,从该方法继承了此执行模型。与在C / C ++中调用函数相反(在C / C ++中,函数地址是在编译时确定的),在运行时调度所有方法称为“真实消息发送”(C ++虚拟方法除外)。但是我不能说Objective-C的速度要慢多少。ASAIK由于性能下降而仅用于应用程序开发。


1
发现C本的性能比较:rmarcus.info/?p=488像Objective-C的长相仍然相当接近C.
OlliP

将Objective C与基准测试中
Deer Hunter

我认为性能比较需要花费一些精力,因为Objective-C代码是对C语言的扩展,而不是Objecttive-C消息发送。我不知道降级是为了什么。我从事Smalltalk开发已有十多年了,Objective-C在许多方面都基于Smalltalk。我想知道我在说什么。
OlliP 2013年

不是下注者;我主要感兴趣的重数值算法,动态调度无所谓多少 之内的。
Deer Hunter

8

简短的答案:它被编译为与C / C ++ / D / Go / Rust类似的格式。它不使用Java / .Net这样的虚拟环境。而且它的解释方式不像Python / Ruby / Lua / JavaScript。因此,它处于频谱的更快端。


7

正如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缓存未命中,这可能很困难。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.