Dart: performance di dart2js in costante aumento

Di - 13 December 2013 - in
Post image for Dart: performance di dart2js in costante aumento

Nelle ultime settimane sono arrivate dal mondo di Dart un sacco di grandi novità, fra cui le più interessanti sono state il lancio della prima versione stabile e l’inizio dei lavori su un ambiente di sviluppo integrato basato su web, Spark. Nell’articolo di oggi parleremo di uno dei fattori che ha reso possibile i progressi della piattaforma e la sua larga adozione: il costante incremento delle performance di dart2js, il compilatore Javascript.

+Bernhard Pichler, il creatore della libreria per la migrazione da Flash a HTML5 Stage XL, ha riassunto in un post su Google+ i benchmark di un algoritmo per la sfocatura di un’immagine, mostrando un incremento di performance del 320%. Il codice utilizzato per questi benchmark è disponibile su github.
Prima del rilascio della versione stabile di Dart l’esecuzione dell’algoritmo — che prende in ingresso un’immagine della grandezza di 320×320 px e la sfoca — impiegava 42 millisecondi. Pichler spiega che grazie ai miglioramenti dell’operatore di divisione fra numeri interi (~/), della gestione dei typed arrays e dell’operatore shift right orientato ai bit >>, l’algoritmo impiega ora solo 13ms per l’esecuzione.

Continuando a parlare di performance, +Seth Ladd, Dart Dev Rel presso Google, mostra in un post sul suo blog una nuova caratteristica di dart2js introdotta poco prima del lancio dell’SDK 1.0, ovvero la possibilità di passare variabili d’ambiente al compilatore direttamente dalla riga di comando usando l’opzione -D (e.g. -DDEBUG=true). La particolarità di queste variabili è che vengono valutate al momento della compilazione e questo permette al compilatore di ignorare le parti di codice che non verrebbero raggiunte durante l’esecuzione (dead code), generando di conseguenza un output più leggero.

Vediamo velocemente l’esempio utilizzato da Seth per mostrare questa nuova feature. Assumiamo che il nostro programma all’avvio invochi log(String msg), una funzione che stampa la stringa msg se il valore della variabile d’ambiente DEBUG è diverso da null:

log(String msg) {
  if (const String.fromEnvironment('DEBUG') != null) {
    print('debug: $msg');
  }
}

main() {
  log('In production, I do not exist');
}

Lanciando il compilatore con la variabile DEBUG uguale a true il codice Javascript generato è il seguente:

main: function() {
    H.printString("debug: In the production release, I do not exist");
}

Senza la variabile, l’output è il seguente:

main: function() {
}

Come ci aspettavamo, il compilatore ha semplicemente ignorato la presenza della funzione log(String msg).

I valori passati come variabili d’ambiente possono essere di tipo String, int e bool, e possono essere rispettivamente ottenuti con String.fromEnvironment(), int.fromEnvironment() e bool.fromEnvironment().

Fonti | Seth Ladd’s Blog, Google+

Leave a Reply

Claudio d'Angelis Articolo scritto da

Programmatore e studente di Informatica, appassionato di musica, web e sistemi UNIX. Collabora con Googlab dall'Ottobre 2012.

Contatta l'autore

Previous post:

Next post: