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

标签 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 代码中的函数,我能够成功编译和运行它。我在项目的其他 C 标志中添加了 O3 优化。但是,当我这样做时,模拟器上的代码需要大约 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 或其特定处理器开发过,所以我不确定,但值得研究)。

另一个可能会放缓的地方是,如果您以某种方式引入的 Objective C 对象和 C 结构之间存在某种转换,并且发生的频率比它应该需要的要多得多。由于这个原因,可能会发生其他减速,但是您可以通过为您的桌面创建一个使用 myprog.c 的 Objective-C 程序来测试这个理论。代码的方式类似于 iPhone 程序的使用方式。

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

我敢肯定,稍微搜索一下就会发现如何解决这个问题。

关于objective-c - 将ansi c导入iphone项目后代码运行非常缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972195/

相关文章:

ios - 为什么我在正确的时区得到错误的时间输出?

ios - 通过点击任何 View 上的本地通知来呈现 View Controller

c++ - 为什么 gcc 对一个版本执行尾调用优化而不对另一个版本执行尾调用优化?

web-services - 定时任务 : Web Service query

objective-c - UIWebView 到 UIImage 无效上下文 0x0

iphone - 使用CGContextDrawPDFPage绘制PDF页面异常泄漏

c - 如何列出物理磁盘?

c - 如何在无符号数组 char 中组合字符和数字

c - UART 不传输/打印超过一个字符

algorithm - 获取第 k 组未排序的结果列表,每组具有任意数量的结果