Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 将ansi c导入iphone项目后,代码运行非常缓慢_Objective C_C_Optimization - Fatal编程技术网

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

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代码中

我有一个大约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秒,这会带来不可接受的用户体验


如果您有任何关于如何让这项工作顺利进行的建议,我们将不胜感激。

很难说慢度是从哪里来的,或者是否有任何解决方法,但您马上就做了错事

您不应该将.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程序。分析确定(或在某些情况下仅帮助确定)程序在何处花费时间。了解这一点并不一定会告诉您运行最多的代码是不好的,或者任何关于它的东西都可以改进,但它确实会告诉您应该去哪里寻找。有时,当你看到结果时,你会马上知道,一些你认为在程序开始时只会被调用一次的函数实际上被反复调用,这高度表明,可以做一些改进


我相信,稍加搜索就会发现如何进行此操作。

在后台线程中运行它并提供进度条?听起来这只是处理器速度的问题。