Ho fatto un'app intensiva di calcolo utilizzando OpenCV
per iOS
. Certo che era lento. Ma era qualcosa come 200 volte più lento del mio prototipo di PC. Quindi lo stavo ottimizzando. Dai primi 15 secondi sono riuscito a ottenere una velocità di 0,4 secondi. Mi chiedo se ho trovato tutte le cose e quello che gli altri potrebbero voler condividere. Quello che ho fatto:Velocità massima da IOS/iPad/iPhone
sostituito "
double
" tipi di dati all'interno OpenCV a "float
". Double è a 64 bit e la CPU a 32 bit non può gestirli facilmente, quindi float mi ha dato un po 'di velocità. OpenCV usa il doppio molto spesso.Aggiunto "
-mpfu=neon
" alle opzioni del compilatore. L'effetto collaterale è stato un nuovo problema che il compilatore di emulazione non funziona più e tutto può essere testato solo su hardware nativo.Sostituito
sin()
ecos()
implementazione con 90 tabelle di ricerca valori. La velocità era enorme! Questo è alquanto opposto al PC dove tali ottimizzazioni non danno alcun tipo di accelerazione. Il codice funzionava in gradi e questo valore è stato convertito in radianti persin()
ecos()
. Anche questo codice è stato rimosso. Ma le tabelle di ricerca hanno fatto il lavoro.Abilitato
"thumb optimizations"
. Alcuni post di blog consigliano esattamente l'opposto, ma questo perché il pollice rende le cose di solito più lente suarmv6
.armv7
è privo di problemi e rende le cose solo più veloci e più piccole.Per assicurarsi che le ottimizzazioni del pollice e
-mfpu=neon
funzionino al meglio e non introducano arresti anomali, ho rimosso completamente il target armv6. Tutto il mio codice è compilato alloarmv7
e questo è indicato anche come requisito nell'app store. Questo significa che il minimoiPhone
sarà3GS
. Penso che sia giusto abbandonare quelli più vecchi. In ogni caso quelli più vecchi hanno CPU più lente e l'app intensiva della CPU fornisce un'esperienza utente negativa se installata sul vecchio dispositivo.Naturalmente io uso
-O3 flag
ho cancellato
"dead code"
da OpenCV. Spesso quando ottimizzo OpenCV vedo un codice che chiaramente non è necessario per il mio progetto. Per esempio, spesso c'è un extra"if()"
per verificare che la dimensione dei pixel sia 8 o 32 bit e so che ho bisogno solo di 8 bit. Ciò rimuove alcuni codici, offre all'ottimizzatore migliori possibilità di rimuovere qualcosa di più o di sostituirli con costanti. Anche il codice si adatta meglio alla cache.
Altri trucchi e idee? Per me abilitare il pollice e sostituire la trigonometria con le occhiate sono stati i produttori di boost e mi hanno fatto sorprendere. Forse sai qualcosa di più da fare che fa volare le app?
Questo Accelerate era nuovo per me. È ancora un po 'difficile da usare in quanto ha bisogno di un livello di pensiero complessivo. Ma ancora possibile e magari andando a fare un tentativo. Lo contrassegno accettato più tardi perché voglio vedere se qui riceviamo suggerimenti più utili. –
C'è una sessione nei video del WWDC 2012 che si occupa interamente del framework Accelerate. Dagli un'occhiata ^^ – borrrden
http://adcdownload.apple.com//wwdc_2012/wwdc_2012_session_pdfs/session_708__the_accelerate_framework.pdf e https://developer.apple.com/videos/wwdc/2012/#708 sembra essere link per questo –