Da pochi giorni è stato rilasciata la versione 4.3 di iOS. Sicuramente una delle novità più interessanti, introdotte da Apple, è il nuovo Nitro JavaScript engine, il quale permette una forte riduzione nei tempi di esecuzione. Poco dopo il rilascio è stato subito notato, da The Register e da altri, come i miglioramenti sulla velocità di esecuzione del JavaScript siano vincolati all'esecuzione su Safari, mentre lo stesso JavaScript eseguito in modalità HomeScreen o in una UIWebView di una App mostra performance molto più basse.

Vista l'attenzione che riponiamo sul rapporto JavaScript&iOS, ci siamo posti l'obiettivo di misurare l'entità di questa differenze di performance variando il dispositivo, la versione di iOS ed l'ambiente di esecuzione del JavaScript. Per i test abbiamo usato il JS benchmark di SunSpider. Di seguito è riportata la tabella con i risultati. Gli errori non sono riportati poichè tutti simili tra loro ed intorno all'1%; i valori nella tabella sono espressi in secondi.

 

  Safari HomeScreen UIWebView
[iOS 4.3]      
iPad 3.3 8.3 7.6
iPhone 4 4.2 10.4 9.6
iPhone 3GS 5.2 13.7 12.6
       
[iOS 4.2]      
iPhone 3GS 13.7 13.8 -
       
Simulator iOS 4.3 1.7 1.7 1.9
Simulator iOS 4.2 1.7 2.0 1.8

 

Da subito si evince che le differenze di prestazione, dovute all'ambiente dove viene fatto girare il benchmark, sono evidenti sotto iOS 4.3. Infatti i tempi di esecuzione dentro Safari sono meno della metà degli altri casi e questo si verifica su tutti i dispositivi testati. Sono invece simili le prestazione dentro la HomeScreen e la UIWebView, con una lieve differenza a favore di UIWebView. Abbiamo, anche, verificato i tempi di esecuzione in iOS 4.2; in questo caso non si notano differenze rispetto all'ambiente dove viene eseguito il benchmark ed i tempi sono in accordo con quelli di iOS 4.3 usando HomeScreen o UIWebView. Per completezza abbiamo anche verificato cosa succede sul simulatore. Qui i tempi sono tutti simili sia nella versione iOS 4.2 che in quella 4.3.

In conclusione quello che sembra evidente è che il boost di prestazione è limitato alle applicazioni JavaScript che girano sotto Safari, negli altri casi si rimane allo stato di iOS 4.2. Che sia un bug, una disattenzione o una scelta volontaria da parte di Apple non ci è dato saperlo. Comunque in questo post, legano le differenze di prestazione alla natura delle ottimizzazioni introdotte da Nitro JavaScript engine:

The engine converts JavaScript code into native ARM machine code.

Third parties have never been able to get access to [...] library that generates native code dynamically