2011-12-05 293 views
28

如果有許多浮點操作正在進行,Apple建議編譯爲ARM而不是拇指。我的整個應用程序幾乎是一個大的浮點操作。有沒有辦法在Xcode 4中編譯ARM而不是Thumb?

下面是他們的iOS應用開發流程指南在說什麼:

iOS設備支持兩種指令集,ARM和Thumb。 Xcode默認使用了Thumb指令,因爲使用Thumb通常會相對於ARM將代碼大小減少約35%。具有 全面浮點代碼的應用程序如果使用ARM 指令而不是Thumb,則性能可能會更好。您可以關閉拇指爲您 應用程序,所以它編譯爲ARM,通過設置到號設置編譯爲Thumb 構建

但是,我找不到任何「編譯爲Thumb」在我的構建設置設置。他們重新命名了嗎?或者現在Xcode 4無法使用?

回答

48

首先,爲了提高浮點性能而不對Thumb指令集進行編譯的建議僅適用於舊的ARMv6器件。

ARMv7硬件(iPhone 3G S及更新版本,包括所有iPad)使用效率更高的Thumb-2指令集,該指令集不會遭受相同類型的浮點減速。對於ARMv7構建,幾乎在所有情況下都建議您爲Thumb構建。我在回答here中提供了更多關於此的更多細節。

這可能是該編譯器設置不再作爲常見選項公開的原因,因爲ARMv7設備是絕大多數iOS設備。

如果您只想爲您的ARMv6構建完成此操作,則可以轉到構建設置並將鼠標懸停在「其他C標記」選項上。點擊此選項右側出現的小加號按鈕,爲ARMv6架構添加條件。再次爲ARMv7架構創建一個。在ARMv6體系結構下,添加額外的編譯器標誌-mno-thumb(如Kevin所示)。

您應該結束了的東西,看起來像下面這樣:

Build settings for ARMv6

我這樣做是在我的應用程序之一,因爲我沒有看到與老ARMv6的設備性能的提升。然而,另一個應用程序在沒有爲ARMv6構建Thumb時速度較慢,因此您首先需要進行配置。

另外,還有currently a bug in the LLVM Compiler 3.0 that ships with Xcode 4.2(從4.2.1版本開始我就已經修復了這個問題),其中在ARMv6的Thumb下浮點計算編譯錯誤。如果您使用的是特定版本的Xcode,那麼您需要在舊設備上正確執行此操作。

+0

Xcode 4.2.1似乎只適用於Lion。如果Photoshop和一大堆其他應用程序不會在Lion中遇到大問題,它會使用它。該死的。在Xcode 4.2中有沒有解決這個問題的方法?你能否指出如果Lion不是一種選擇,該怎麼辦? – openfrog

+1

@openfrog - 就像我上面展示的那樣,在針對ARMv6的時候不要爲Thumb構建。 ARMv7沒有這樣的問題,並且可以使用Thumb指令構建就好了。說實話,禁用Thumb版ARMv6不會影響你的許多用戶,因爲估計會將ARMv6設備放在當前活躍的iOS設備的3-5%:http://www.marco.org/ 2011/11/30/more-ios-device-and-os-version-stats-from-instapaper –

+0

Sweeeeet!非常感謝! –

8

我不知道「編譯爲Thumb」是否應該存在於Xcode 4中,但您始終可以將-mno-thumb添加到其他C標記構建設置。

3

關於您的原始問題:我注意到Xcode 4.2.1中的「編譯爲Thumb」(在「項目構建設置」的「代碼生成」部分下)僅在您使用LLVM GCC 4.2(如果在「Compiler for C/C++/Objective-C」中設置)!

如果使用Apple LLVM 3.0進行編譯,則不會發現「編譯爲Thumb」選項。但是 - 正如布拉德所說 - 你仍然可以改變「其他C標誌」選項來關閉拇指模式。另外一個有趣的問題是:我在我的項目中使用sqlite合併源(我需要fts--全文搜索),並且自從使用LLVM 3.0進行編譯時,每當訪問數據庫時,我都會在armv6設備上出現奇怪且相當隨機的崩潰:因爲它原因是編譯armv6設備時Thumb模式未被禁用。

+0

我也期待在armv6上的sqlite崩潰,但只有當我用llvm gcc構建庫時。切換到llvm後 - 它工作正常。 –

相關問題