slf*_*slf 68 c++ iphone optimization performance objective-c
在iPhone或其他便携式硬件上编程CPU密集型或GPU密集型应用程序时,您必须做出明智的算法决策,以使您的代码更快.
但是,如果你使用的语言表现得比另一种语言差,那么即使是很好的算法选择也会很慢.
有没有比较Objective-C和C++的硬数据,特别是在iPhone上,但可能只是在Mac桌面上,以获得各种类似语言方面的表现?我非常熟悉这篇比较C和Objective-C的文章,但这是一个比较两种面向对象语言的更大问题.
例如,C++ vtable查找是否真的比Obj-C消息快?多快了?线程,多态,排序等.在我开始构建具有重复对象模型和各种测试代码的项目之前,我想知道是否有人已经完成了这个以及结果在哪里.这种类型的测试和比较本身就是一个项目,可能需要相当长的时间.也许这不是一个项目,但可以比较两个而且只有输出.
我正在寻找硬数据,而不是传福音.像许多人一样,我喜欢和讨厌两种语言,原因各种各样.此外,如果有人在那里积极地追求同样的事情,我会有兴趣投入一些代码来查看最终结果,我相信其他人也会帮忙.我的猜测是他们都有优点和缺点,我的目标是准确找出它们是什么,以便在现实世界的场景中避免/利用它们.
Bra*_*son 58
在他的"常见操作的性能比较"一文中, Mike Ash对于各种Objective-C方法调用与C和C++的执行有一些难以理解的数字.此外, Savoy Software的这篇文章在使用Objective-C++调整iPhone应用程序的性能时是一个有趣的读物.
我更倾向于使用Objective-C的清晰,描述性语法而不是Objective-C++,并且没有发现语言本身是我性能瓶颈的根源.我甚至倾向于做我知道的事情,如果他们让我的代码更易于维护,就会牺牲一些性能.
jus*_*tin 55
是的,编写得好的C++要快得多.如果你正在编写性能关键程序而你的C++没有C那么快(或者只有几个百分点),那就错了.如果您的ObjC实现与C一样快,那么通常会出现错误 - 即程序可能是ObjC OOD的一个不好的例子,因为它可能使用一些"脏"技巧来降低它在其中运行的抽象层之下,例如直接ivar访问.
Mike Ash的"比较"非常具有误导性 - 我绝不会建议比较你编写的程序执行时间的方法,或者推荐它比较C vs C++ vs ObjC.显示的结果是在禁用编译器优化的测试中提供的.在测量执行时间时,禁用优化编译的程序很少相关.将其视为将C++与Objective-C进行比较的基准是有缺陷的.该测试还比较了各个功能,而不是整个现实世界优化的实现 - 单个功能以两种语言以非常不同的方式组合.这远非优化实现的现实性能基准.示例:启用优化后,IMP
缓存与虚函数调用一样慢.virtual
可以积极地优化静态分派(与动态分派相反,例如使用)和对已知C++类型(可以绕过动态分派)的调用.这个过程称为虚拟化,当使用它时,声明的成员函数virtual
甚至可以是inline
d.在Mike Ash测试的情况下,对已声明且具virtual
有空体的成员函数进行了许多调用:当类型已知时,这些调用完全被优化掉,因为编译器看到了实现并且能够确定动态调度是不必要.编译器还可以消除对malloc
优化构建的调用(支持堆栈存储).因此,在C,C++或Objective-C中启用任何编译器优化都会在执行时间方面产生巨大差异.
这并不是说所呈现的结果完全没用.如果要确定是否有他们花费的时间之间的差异衡量你可以得到有关的外部API一些有用的信息,pthread_create
或者+[NSObject alloc]
在一个平台或架构与另一个.当然,这两个示例将在您的测试中使用优化的实现(除非您碰巧正在开发它们).但是,为了在编译的程序中将一种语言与另一种语言进行比较...在禁用优化的情况下,显示的结果无效.
对象创建
还要考虑ObjC中的对象创建 - 每个对象都是动态分配的(例如在堆上).使用C++,可以在堆栈上创建对象(例如,与创建C结构和在许多情况下调用简单函数一样快),在堆上或作为抽象数据类型的元素.每次分配和释放(例如通过malloc/free),您都可以引入锁定.在堆栈上创建C结构或C++对象时,不需要锁定(尽管内部成员可能使用堆分配),并且通常只需要几条指令或一些指令以及一个函数调用.
同样,ObjC对象是引用计数实例.对象std::shared_ptr
在性能关键C++中的实际需求非常罕见.在C++中,不必或不希望将每个实例都作为共享的引用计数实例.使用C++,您可以更好地控制所有权和生命周期.
数组和集合
C和C++中的数组和许多集合也使用强类型容器和连续内存.由于下一个元素成员的地址通常是已知的,因此优化器可以执行更多操作,并且您具有很好的缓存和内存位置.使用ObjC,标准对象(例如NSObject
)远非现实.
调度
关于方法,许多C++实现使用很少的虚拟/动态调用,特别是在高度优化的程序中.这些是静态方法调用和优化器的饲料.
使用ObjC方法,每个方法调用(objc消息发送)都是动态的,因此是优化器的防火墙.最终,这会导致许多限制或不便,因为在编写性能关键的ObjC时,您可以做什么,不能做什么来保持最低性能.这可能会导致更大的方法,IMP缓存,频繁使用C.
某些实时应用程序无法在其渲染路径中使用任何 ObjC消息传递.无 - 音频渲染就是一个很好的例子.ObjC调度根本不是为实时目的而设计的; 在发送消息对象时,分配和锁定可能发生在幕后,使得对象消息的复杂性/时间不可预测,音频呈现可能会错过其截止日期.
其他特性
C++还为其许多库提供了泛型/模板实现.这些优化非常好.它们是类型安全的,并且可以使用模板进行大量内联和优化(考虑在编译时发生的多态性,优化和特化).C++增加了几个在严格的ObjC中不可用或不具备的功能.尝试直接比较非常不同的lang,对象和库并不是那么有用 - 它只是实际实现的一小部分.考虑到设计和实现的许多方面,最好将问题扩展到库/框架或实际程序.
其他要点
在构建的各个阶段(剥离,死代码消除,内联和早期内联以及链接时间优化)中,可以更容易地删除和优化C和C++符号.这样做的好处包括减少二进制大小,减少启动/加载时间,减少内存消耗等.对于单个应用程序,这可能不是什么大问题; 但如果你重复使用了很多代码,那么你的共享库可能会给程序增加很多不必要的重量,如果实现了ObjC - 除非你准备跳过一些火红的箍.因此,可扩展性和重用也是中型/大型项目以及重用率较高的组的因素.
包括的图书馆
ObjC库实现者还针对环境进行了优化,因此其库实现者可以利用一些语言和环境特性来提供优化的实现.虽然在纯ObjC中编写优化程序时存在一些非常重要的限制,但Cocoa中存在一些高度优化的实现.这是Cocoa的优点之一,尽管C++标准库(有些人称之为STL)也不乏懈怠.Cocoa的抽象级别比C++高得多 - 如果你不清楚你正在做什么(或应该做什么),那么靠近金属操作可能真的让你付出了代价.如果你不是某个领域的专家,那么回到一个好的库实现是一件好事,除非你真的准备学习.同样,Cocoa的环境有限; 您可以找到更好地利用操作系统的实现/优化.
如果您正在编写优化程序并且在C++和ObjC中都有这样的经验,那么干净的 C++实现通常会比干净的 ObjC 快两倍(是的,您可以与Cocoa进行比较).如果您知道如何优化,通常可以比更高级别的通用抽象更好.虽然,一些优化的C++实现将与Cocoa一样快或更慢(例如,我对文件I/O的初始尝试比Cocoa慢 - 主要是因为C++实现初始化其内存).
很多都归结为您熟悉的语言功能.我使用两种语言,它们都有不同的强度和模型/模式.它们相互补充,并且两者都有很好的库.如果你正在实现一个复杂的,性能关键的程序,正确使用C++的特性和库将为你提供更多的控制并为优化提供显着的优势,这样在正确的手中,"快几倍"是一个很好的默认期望(不要期望每次都赢,或者没有一些工作.请记住,理解C++需要花费数年才能真正达到这一点.
我将大多数性能关键路径保留为C++,但也认识到ObjC对于某些问题也是一个非常好的解决方案,并且有一些非常好的库可用.
Joh*_*ski 31
为此收集"硬数据"非常困难,这不是误导.
像你建议的那样进行功能到功能比较的最大问题是这两种语言鼓励使用截然不同的编码风格.Objective-C是一种带有duck typing的动态语言,典型的C++用法是静态的.相同的面向对象架构问题可能会使用C++或Objective-C有非常不同的理想解决方案.
我的感觉(因为我已经用两种语言编写了很多,主要是在大型项目上):为了最大化Objective-C性能,它必须写得非常接近C.而使用C++,可以更多地使用这种语言而不用与C相比的任何性能损失
哪一个更好?我不知道.对于纯粹的性能,C++总是有优势.但是Objective-C的OOP风格绝对有其优点.我绝对认为用它来保持理智的架构更容易.
这实际上不是一般可以回答的问题,因为它实际上取决于您如何使用语言功能.两种语言都会有他们擅长的东西,他们速度慢的东西,以及有时快速且有时很慢的东西.这取决于您使用的内容以及使用方式.唯一可以确定的方法是分析您的代码.
在Objective C中,你也可以写C++代码,所以它可能是更容易的目标C大部分代码,如果你发现没有在它执行好东西,那么你可以在书面方式一个C++版本一展身手它看起来是否有帮助(C++往往在编译时更好地优化).目标C会更容易,如果你的API与也写在它的接口使用,再加上你可能会发现这是OOP的风格更容易或更灵活.
最后,你应该用你知道你可以写在安全,可靠的代码去,如果你发现需要从其他语言特别关注的领域,那么你就可以换到.X-Code允许您在同一个项目中编译.
归档时间: |
|
查看次数: |
45300 次 |
最近记录: |