如果有许多浮点运算正在进行,Apple建议为ARM而不是拇指进行编译。我的整个应用程序几乎是一个大的浮点操作。
以下是他们在iOS应用开发工作流程指南中所说的内容:
iOS设备支持两个指令集,ARM和Thumb。 Xcode使用 默认情况下Thumb指令因为使用Thumb通常会减少 相对于ARM,代码大小约为35%。有的应用程序 如果使用ARM,广泛的浮点代码可能会表现得更好 说明而不是拇指。您可以关闭Thumb 应用程序,因此它通过设置Compile for Thumb为ARM编译 将设置设置为编号
但是,我在构建设置中找不到任何“Compile for Thumb”设置。他们重命名了吗?或者Xcode 4现在不可用?
答案 0 :(得分:49)
首先,为了提高浮点性能而不为Thumb指令集编译的建议仅适用于旧的ARMv6设备。
ARMv7硬件(iPhone 3G S及更新版本,包括所有iPad)使用更高效的Thumb-2指令集,它不会遭受相同类型的浮点减速。对于ARMv7版本,几乎在所有情况下都建议您为Thumb构建。我在答案here中提供了更多有关此内容的详细信息。
这可能就是为什么这个编译器设置不再作为常见选项公开的原因,因为ARMv7设备是绝大多数的iOS设备。
如果您只想为ARMv6版本执行此操作,则可以转到构建设置并将鼠标悬停在“其他C标志”选项上。单击此选项右侧显示的小加号按钮,为ARMv6体系结构添加条件。再次执行此操作以为ARMv7体系结构创建一个。在ARMv6体系结构下,添加-mno-thumb
的额外编译器标志(正如Kevin建议的那样)。
您应该得到如下所示的内容:
我在我的一个应用程序中执行此操作,因为我确实看到旧版ARMv6设备的性能提升。但是,在ARMv6上没有为Thumb构建时,我的另一个应用程序速度较慢,因此您需要先对其进行分析。
此外,还有currently a bug in the LLVM Compiler 3.0 that ships with Xcode 4.2(从我听到的内容已经在4.2.1中修复),其中浮点计算在Thumb for ARMv6下编译错误。如果您使用的是特定版本的Xcode,则需要在旧设备上正确执行此操作。
答案 1 :(得分:8)
我不知道Xcode 4中是否存在“Compile for Thumb”,但您始终可以将-mno-thumb
添加到其他C标志构建设置。< / p>
答案 2 :(得分:3)
关于您的原始问题:我注意到Xcode 4.2.1中的“Compile for Thumb”(在“项目构建设置”的“代码生成”部分下)仅在您使用LLVM GCC 4.2时可用(如果在“Compiler for C / C ++ / Objective-C”中设置!
如果使用Apple LLVM 3.0进行编译,则会发现没有“Compile for Thumb”选项。但是 - 正如Brad已经说过的那样 - 您仍然可以更改“其他C标志”选项以关闭Thumb模式。
另一个有趣的观点:我在我的项目中使用sqlite合并源(我需要fts - 全文搜索),并且自从使用LLVM 3.0进行编译后,无论何时访问数据库,我都会在armv6设备上发生奇怪且相当随机的崩溃:那是因为在编译armv6设备时没有禁用Thumb模式。