Objective c 将ansi c导入iphone项目后,代码运行非常缓慢
我有一个大约10000行长的ANSI C代码,我正试图在iPhone项目中使用它。在命令行上使用gcc编译代码时,我键入以下内容: gcc-o myprog-O3 myprog.c 这个程序读入大的jpeg文件,并对它们进行一些奇特的处理,所以我用下面的代码称之为 ./myprog mypic.jpg 从命令行来看,这大约需要0.1秒 我正试图将这段代码导入到一个iPhone项目中,但我不完全确定如何导入。通过将myprog.c重命名为myprog.h,然后从通用NSObject类中调用c代码中的函数,我成功地编译并运行了它。我将O3优化添加到项目的其他C标志中。然而,当我这样做的时候,模拟器上的代码运行大约需要2秒,而iPhone上的代码运行大约需要7秒,这会带来不可接受的用户体验Objective c 将ansi c导入iphone项目后,代码运行非常缓慢,objective-c,c,optimization,Objective C,C,Optimization,我有一个大约10000行长的ANSI C代码,我正试图在iPhone项目中使用它。在命令行上使用gcc编译代码时,我键入以下内容: gcc-o myprog-O3 myprog.c 这个程序读入大的jpeg文件,并对它们进行一些奇特的处理,所以我用下面的代码称之为 ./myprog mypic.jpg 从命令行来看,这大约需要0.1秒 我正试图将这段代码导入到一个iPhone项目中,但我不完全确定如何导入。通过将myprog.c重命名为myprog.h,然后从通用NSObject类中调用c代码中
如果您有任何关于如何让这项工作顺利进行的建议,我们将不胜感激。很难说慢度是从哪里来的,或者是否有任何解决方法,但您马上就做了错事 您不应该将.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文件编译成一个对象文件(或库),并将主程序与之链接。如果要将实际上只是重命名的.c文件的.h文件包含到多个源代码文件中,则可能会导致程序中某些数据和代码的多个版本
您可能还需要仔细检查并分离myprog.c中您不会在iPhone程序中使用的任何代码。我敢打赌有很多
至于为什么程序会慢下来,这可能与编写myprog以利用iPhone上无法使用的某些资源有关。首先想到的是大量的RAM,因为许多桌面应用程序的编写都好像可用RAM是无限的,我可以看到一些.jpg操作代码是如何以这种方式编写的。解决这一问题的方法是尝试重新设计算法,以便在处理时不会一次加载太多的图片
第二件事是浮点代码。浮点操作在图像处理代码中很常见,但在嵌入式系统中通常不可用或受到严重限制。就iPhone而言,它们是可用的,但据我所知,如果将代码编译为thumb而不是常规ARM代码,它们的性能会明显受到影响。(我从未为iPhone或其特定处理器开发过,所以我不确定,但值得研究)
另一个事情可能会放缓的地方是,如果在目标C对象和C结构之间存在某种转换,您已经以某种方式引入了这种转换,并且这种转换的频率比需要的要高很多。这可能会导致其他减速,但您可以通过为您的桌面创建一个objective C程序来测试这一理论,该程序使用myprog.C
代码的方式与iPhone程序的使用方式类似
另一件你可能应该研究的事情是分析你的iPhone程序。分析确定(或在某些情况下仅帮助确定)程序在何处花费时间。了解这一点并不一定会告诉您运行最多的代码是不好的,或者任何关于它的东西都可以改进,但它确实会告诉您应该去哪里寻找。有时,当你看到结果时,你会马上知道,一些你认为在程序开始时只会被调用一次的函数实际上被反复调用,这高度表明,可以做一些改进
我相信,稍加搜索就会发现如何进行此操作。在后台线程中运行它并提供进度条?听起来这只是处理器速度的问题。