语言速度c与目标c

时间:2011-09-10 09:58:43

标签: objective-c c ios performance

我一直在想,c比客观c快多快?从我的理解c确实运行得更快。我最近在我的应用程序中实现了一个数学函数(用标准c编写),希望它能提高速度,但它真的有那么大的影响吗?

欢呼GC

4 个答案:

答案 0 :(得分:5)

正如其他人所说,算法比语言更重要。话虽如此,毫无疑问,有时您必须优化速度敏感代码。每个Objective-C方法调用都需要比普通C函数调用更多的指令。在严格的游戏循环中分配对象通常也是一个坏主意,iOS和Mac OS X调用都倾向于分配大量对象。

在过去,即使是C ++方法调用在紧密循环中也会太慢,C ++方法调用通常比Objective-C调用快。在现代机器上,你不会看到这些类型的问题,但它们仍然存在。 Core Audio过滤器是一个很好的代码示例,由于速度问题需要用纯C而不是Objective-C编写。

我建议使用Objective-C编写代码,然后运行它以查看它是否太慢。如果是这样,请运行仪器并查看您花费大部分时间的地方。然后使用普通的C,C ++甚至汇编语言来优化代码(好吧,只是开玩笑说汇编语言,除非你真的推动了这个问题)。

如果你发现循环中的方法调用开销减慢了你的速度,你可以通过使用普通的C函数调用,内联例程,展开循环或使用IMP指针来避免方法查找开销来优化它。

如果您发现过多地复制数据,可以通过共享缓冲区而不是复制它们或者使用[NSData dataWithBytesNoCopy]而不是[NSData dataWithBytes]等来优化它们。

有时您可以优化图形以便更快地绘制 - 在不需要的地方删除透明胶片。不要使用CALayer阴影或模糊。所有新Mac和许多iOS设备都有两个或更多CPU内核,因此您可以使用线程将某些处理卸载到第二个核心。这个清单一直在继续。

因此,首先使用Objective-C使用合理的算法编写应用程序,然后在看到问题所在时进行优化。不要做任何太愚蠢的事情,比如在一个紧凑的循环中通过一个大型数组循环n ^ 2次,你可能会对90%的代码感到满意。

答案 1 :(得分:3)

编译为本机代码的任何语言都会在任何给定任务上为处理器生成大致相同的指令。语言本身并不意味着任何速度提升。组装比C快,这是一种常见的误解; C比C ++ / Objective-C更快/你有什么。

这一切都归结为你如何设计你的算法。当然,每条规则都有例外。

答案 2 :(得分:3)

性能上应该没有明显的区别,特别是对于你描述的代码类型,它本质上是由Objective-C编译器编译的C代码。

答案 3 :(得分:3)

它归结为算法,但在汇编中你可以做C通常不能做的事情。这包括组织程序的某些调用,以便不需要推送和拉出堆栈。

如果您需要除以2,例如对于给定任务需要整数,那么在汇编中您可以简单地进行寄存器移位(如果它是一个大数字,则可以进行几次移位)。 C通常必须进行调用,推送和拉入堆栈,而单独的开销使得速度慢得多。

所以是的,上面在技术上是一个算法差异,但汇编编程允许你这样做。然后,您将上述想法应用于数学函数数组,并且可以发出速度差异。尽量减少对C的影响虽然显然是将新的汇编代码放入C的库中。与直接汇编程序相比,您仍然会有开销,但随后您也可以获得更高级算法的更高生产率的最佳算法。