将ansi c导入iphone项目后,代码运行速度非常慢

时间:2010-10-19 19:54:52

标签: objective-c c optimization

我有一个大约10,000行的ANSI C代码,我试图在iPhone项目中使用它。当我在命令行上使用gcc编译代码时,我输入以下内容:

gcc -o myprog -O3 myprog.c

这个程序读入大型jpeg文件并对它们进行一些奇特的处理,所以我用以下方法调用它

./ myprog mypic.jpg

从命令行开始,大约需要0.1秒。

我正在尝试将此代码导入iPhone项目,但我不完全确定如何。通过将myprog.c重命名为myprog.h然后在通用NSObject类中调用C代码中的函数,我能够成功编译并运行。我将O3优化添加到项目的Other C Flags中。但是,当我这样做时,模拟器上的代码需要大约2秒才能运行,而在iPhone上大约需要7秒才能运行,这会产生令人无法接受的用户体验。

任何关于锄头的提示都会非常感激。

1 个答案:

答案 0 :(得分:3)

很难确定缓慢来自哪里,或者周围有什么方法,但是你马上就做错了。

您不应该将.c文件重命名为.h文件并将其包含在内。您应该编写一个.h(头文件)文件,其中声明了函数,变量和类型声明:

myprog.h:

#ifndef MYPROG_H_
#define MYPROG_H_

struct thing {
     int a;
     int b;
};

extern int woof;

int foo(void * buf, int size);

#endif /* MYPROG_H_ */

然后你应该将.c文件编译成目标文件(或库)并将主程序链接到该文件。如果您将.h文件实际上只是一个重命名的.c文件包含在多个源代码文件中,则可能导致程序中存在多个版本的某些数据和代码。

您可能还想要通过并分离myprog.c中您不会在iPhone程序中使用的任何代码。我敢打赌,有很多。

至于为什么程序运行速度变慢,这可能与编写myprog以利用iPhone上没有的一些资源有关。首先想到的是大量的RAM,因为许多桌面应用程序都被编写为可用的RAM是无限的,我可以看到一些.jpg操作代码可以用这种方式编写。解决这个问题的方法是尝试重新编写算法,以便在处理算法时不会同时加载图片。

第二件事是浮点代码。浮点运算在图像处理代码中很常见,但在嵌入式系统中通常不可用或严重受限。在iPhone的情况下,它们是可用的,但根据我听到的情况,如果您将代码编译为拇指而不是常规ARM代码,它们的性能会明显受到阻碍。 (我从来没有为iPhone或其特定的处理器开发,所以我不确定,但值得研究。)

另一个可能放慢速度的地方就是如果在Objective C对象和C结构之间进行某种转换,那么你已经以某种方式介绍了这种转换并且发生的频率远远超过它应该需要的范围。由于这个原因,可能还会出现其他缓慢的问题,但是您可以通过为您的桌面创建一个客观的C程序来测试这个理论,该程序使用myprog.c代码的方式与iPhone程序的使用类似它的。

您可能应该研究的另一件事是分析您的iPhone程序。分析确定(或仅在某些情况下有助于确定)程序花费时间的位置。知道这一点并不一定告诉你运行最多的代码是坏的或者有关它的任何东西都可以改进,但它确实告诉你在哪里看。有时您可能会查看结果并立即知道您认为在程序开始时只调用一次的某些函数实际上是被重复调用的,这强烈表明可以进行一些改进。

我确信稍微会有一些搜索结果。