2011-12-05 10 views
28

Apple consiglia di compilare per ARM anziché per pollice se ci sono molte operazioni in virgola mobile in corso. La mia intera app è quasi una grande operazione in virgola mobile.C'è un modo per compilare ARM piuttosto che Thumb in Xcode 4?

Ecco che cosa dicono su App Guida allo sviluppo iOS Workflow:

dispositivi iOS supportano due set di istruzioni ARM, e il pollice. Xcode utilizza le istruzioni del pollice per impostazione predefinita in quanto l'utilizzo di Thumb riduce in genere le dimensioni del codice di circa il 35 percento rispetto a ARM. Le applicazioni con codice a virgola mobile esteso potrebbero avere prestazioni migliori se utilizzano le istruzioni ARM anziché Thumb. È possibile disattivare il pollice per la vostra applicazione , quindi compila per ARM, impostando la compilazione per pollice costruire su No.

Tuttavia, non riesco a trovare alcuna "compilare per pollice" impostazione nelle mie impostazioni di generazione . Lo hanno rinominato? O questo non è disponibile ora con Xcode 4?

risposta

48

In primo luogo, il consiglio di non compilare per l'istruzione Thumb impostato per migliorare le prestazioni in virgola mobile si applica solo ai vecchi dispositivi ARMv6.

L'hardware ARMv7 (iPhone 3G S e successivi, inclusi tutti gli iPad) utilizza il set di istruzioni Thumb-2 più efficiente, che non subisce lo stesso tipo di rallentamenti in virgola mobile. Per build ARMv7, è consigliato in quasi tutti i casi creati per Thumb. Fornisco un po 'più di dettagli su questo nella mia risposta here.

Questo potrebbe essere il motivo per cui questa impostazione del compilatore non è più esposta come opzione comune, poiché i dispositivi ARMv7 sono la stragrande maggioranza dei dispositivi iOS disponibili.

Se si desidera eseguire questa operazione solo per le build ARMv6, è possibile passare alle impostazioni di generazione e al mouse sull'opzione "Altro C Flags". Fai clic sul piccolo pulsante più che appare a destra di questa opzione e aggiungi una condizione per l'architettura ARMv6. Fallo di nuovo per crearne uno per l'architettura ARMv7. Sotto l'architettura ARMv6, aggiungi il flag del compilatore extra di -mno-thumb (come suggerisce Kevin).

Si dovrebbe finire con qualcosa che è simile al seguente:

Build settings for ARMv6

Faccio questo in una delle mie applicazioni, perché ho fatto vedere un incremento delle prestazioni dei dispositivi ARMv6 anziani con quello. Tuttavia, un'altra delle mie applicazioni è stata più lenta quando non si creava su Thumb su ARMv6, quindi è preferibile eseguire il profilo per primo.

Inoltre, c'è currently a bug in the LLVM Compiler 3.0 that ships with Xcode 4.2 (che è stato fissato in 4.2.1, da quello che ho sentito) dove i calcoli in virgola mobile sono compilati erroneamente sotto Thumb per ARMv6. Se stai usando quella particolare versione di Xcode, dovrai farlo per un comportamento corretto sui dispositivi più vecchi.

+0

Xcode 4.2.1 sembra essere solo per Lion. Lo userei se Photoshop e un sacco di altre app non avrebbero grossi problemi con Lion. Dannazione. C'è una soluzione a questo bug in Xcode 4.2? Puoi indicare cosa fare nel caso in cui Lion non sia un'opzione? – openfrog

+1

@openfrog - Semplicemente non creare Thumb per il targeting di ARMv6 in quel caso, come mostrato sopra. ARMv7 non ha problemi di questo tipo e può essere compilato usando le istruzioni di Thumb bene. Onestamente, la disattivazione di Thumb per ARMv6 non influirà su molti dei tuoi utenti se causerà un rallentamento, poiché le stime collocano i dispositivi ARMv6 al 3-5% dei dispositivi iOS attualmente attivi: http://www.marco.org/ 2011/11/30/more-ios-device-and-os-version-stats-from-instapaper –

+0

Sweeeeet! Molte grazie! –

8

Non so se o non "Compila per pollice" si suppone esistere in Xcode 4 ma si può sempre aggiungere -mno-thumb al Altri C Bandiere impostazione build.

3

Per quanto riguarda la tua domanda originale: ho notato che "Compile for Thumb" (sotto la sezione "Generazione codice" delle "Impostazioni di creazione del progetto") in Xcode 4.2.1 è disponibile solo se si utilizza LLVM GCC 4.2 (se impostato in "Compilatore per C/C++/Objective-C")!

Se si esegue la compilazione con Apple LLVM 3.0, non sarà disponibile l'opzione "Compila per pollice". Ma, come ha già detto Brad, è ancora possibile modificare l'opzione "Altro C Flags" per disattivare la modalità Thumb.

Un altro punto interessante: Sto usando la fonte fusione sqlite nel mio progetto (ho bisogno di FTS - ricerca testo completo) e dal momento che la compilazione con LLVM 3.0 ho avuto incidenti strani e piuttosto casuali su dispositivi ARMv6 ogni volta che accedono al database: come risulta che era a causa della modalità Thumb non disabilitata durante la compilazione per i dispositivi armv6.

+0

mi aspettavo anche arresti di sqlite su armv6, ma solo quando costruisco libreria con llvm gcc. dopo essere passati a llvm, funziona perfettamente. –

Problemi correlati