2015-03-11 5 views
5

Sto lavorando a un'app che elabora array float di grandi dimensioni e sono rimasto estremamente deluso nello scoprire che Swift è apparentemente un buon 10x più lento di Python quando gira sul mio iPhone 5. Suppongo che non possa essere vero, ma io avrei pensato che fosse vero se non avessi testato l'app nel Time Profiler e capito che probabilmente non è il mio algoritmo o l'implementazione di Swift a causare i problemi.L'app Swift funziona solo in modo ragionevole quando è stata creata per il Time Profiler di Xcode?

Quando l'app è creata per il profiler, funziona bene: esegue l'elaborazione in un tempo impercettibilmente piccolo, come dovrebbe. Ma normalmente, se premo il pulsante di esecuzione (simbolo di riproduzione) in Xcode per creare ed eseguire, anche se il compilatore è impostato su Più veloce, sono necessari quasi 20 secondi per essere completato. (Il codice rimane invariato tra le build.) È ridicolmente lento.

E 'abbastanza veloce, quando ho costruire e gestire in un simulatore sul mio MacBook Pro, ma anche poi è più lento di quello che è quando costruito e gestito attraverso il tempo Profiler sul mio piccolo iPhone 5.

Le prestazioni la differenza tra le build è anche presente quando inserisco il seguente codice di test nella funzione application() in AppDelegate, quindi non penso che sia un problema di interfaccia grafica o di threading. E lo stesso codice di test viene eseguito rapidamente quando implementato in Objective-C (in un'app separata sul mio dispositivo) e Python sul mio Mac.

var nums: [Float] = [] 

for var i = 0; i < 250000; i++ { 
    nums.append(Float(i) * 0.001) 
} 

(Questo richiede circa 20 secondi a meno che correre attraverso il tempo Profiler.)

Qualcuno di voi ha provato nulla di simile prima d'ora? Sarei immensamente felice se potessi aiutarmi a capirlo.

+1

funziona se si modifica la configurazione di generazione di rilascio? – NobodyNada

+0

Penso che sia impostato per Rilasciare al momento. Non ho combinato molto con le impostazioni di compilazione, ma forse c'è un modo per ripristinare i valori predefiniti per ogni evenienza? – ICoffeeConsumer

+1

L'impostazione predefinita è Debug, non Release. Quando è impostato su Debug, l'app è lenta ma facile da eseguire il debug, in Release è veloce ma difficile da eseguire il debug. – NobodyNada

risposta

6

Si stava creando l'app in modalità di debug invece della modalità di rilascio. La modalità di debug è molto più facile da eseguire il debug, ma la modalità di rilascio genera codice più veloce.


Quando si crea la modalità Debug, il compilatore inserisce speciali simboli di debug che aiutano il debugger. Una volta ho provato a eseguire il debug di un'app in modalità Release e il debugger non è riuscito a trovare le mie variabili. La modalità di rilascio non solo non include quei simboli, ma ottimizza anche la tua app, generando un file binario che è molto più piccolo e più veloce.


Ecco come passare debug e modalità di uscita:

  • Clicca sul vostro schema in alto a sinistra di Xcode.

Click on your scheme in the top-left corner of Xcode.

  • selezionare "Modifica schema ..."

Select "Edit Scheme..."

  • Cliccare sul menu a discesa "Build Configuration".

Click on the "Build Configuration" dropdown.

  • Modificare la configurazione di generazione di rilascio.

Do I really need to provide alt text here?

  • rigenerare il progetto.

(io non sto fornendo un'immagine qui perché presumo di sapere come ricostruire il vostro progetto.)

+1

Apprezzo davvero: non sei "nada" nessuno per me: p funziona perfettamente ora. Non ho mai avuto problemi con le prestazioni della modalità di debug prima, e in realtà non ho mai notato una differenza, ma è così incredibilmente lento a quello che sto cercando di fare che mi è sembrato un bug strano. – ICoffeeConsumer

+0

Ancora peggio quando vedi che il debug di per sé non è migliorato un po '. È ancora più buggato perché alla fine ha fatto crashare l'app ... –

+3

Sì, ho ** pensato che - fino a quando ho iniziato a programmare per i microcontrollori di Arduino. Non hai nemmeno un debugger; devi lampeggiare LED. E se commetti un errore che causerebbe un crash su iOS, farà qualcosa di bizzarro e inaspettato su Arduino. – NobodyNada

Problemi correlati