2011-09-25 11 views
7

Ho letto the article about Google's upcoming DASH/DART language, che ho trovato abbastanza interessante.In che modo Google Dart può ottenere prestazioni migliori?

Una cosa su cui sono incappato è che dicono che rimuoveranno i problemi di prestazioni inerenti di JavaScript. Ma quali sono esattamente questi problemi di prestazioni? Non ci sono esempi nel testo. Questo è tutto ciò che dice:

  • prestazioni - Dash è stato progettato con caratteristiche di prestazioni in mente, in modo che sia possibile creare macchine virtuali che non hanno la prestazione problemi che tutti EcmaScript VM deve avere.

Avete qualche idea su quali siano questi problemi di prestazioni intrinseche?

+1

Benchmark o non è successo. Speculare sulle prestazioni di qualcosa che non è in vendita è una cazzata. – fijal

+0

La cosa divertente è che Dart sembra essere ** più lento ** di JS. – c69

risposta

5

Un esempio è l'eliminazione tail call (sono sicuro che alcuni lo considerano necessario per prestazioni elevate functional programming). Un feature request è stato messo dentro per Google V8 JavaScript VM, ma questa è stata la risposta:

eliminazione chiamata coda non è compatibile con JavaScript in quanto è utilizzato nel vero mondo.

+0

Perfetto, proprio quello che stavo cercando! – Sune1987

8

Questo thread è un deve leggere per chiunque sia interessato a linguaggio dinamico solo nei compilatori di tempo: http://lambda-the-ultimate.org/node/3851

I partecipanti di questa discussione sono il creatore di luajit, la gente PyPy, sviluppatori JavaScript di Mozilla e molti altri . Presta particolare attenzione ai commenti di Mike Pall (lui è il creatore di luajit) e le sue opinioni su javascript e python in particolare. Dice che il design del linguaggio influenza le prestazioni. Dà importanza alla semplicità e all'ortogonalità, evitando allo stesso tempo i pazzi casi d'angolo che affliggono JavaScript, per esempio.

Qui vengono discusse molte tecniche e approcci diversi (traccianti, metodi, interpreti, ecc.). Dai un'occhiata!

Luis

6

L'articolo si riferisce alle difficoltà di ottimizzazione che provengono da linguaggi estremamente dinamici come JavaScript, più ereditarietà prototipale.

In lingue come Ruby o JavaScript, la struttura del programma può cambiare in fase di esecuzione. Le classi possono ottenere un nuovo metodo, le funzioni possono essere eval() ed esistenti e altro ancora. Ciò rende più difficile ai runtime di ottimizzare il loro codice, perché la struttura non è mai garantita per essere impostata.

L'ereditarietà del prototipo è più difficile da ottimizzare rispetto a più tradizionali linguaggi basati su classi. Sospetto che ciò dipenda dal fatto che ci sono molti anni di esperienza di ricerca e implementazione per VM basate su classi.

È interessante notare che V8 (motore JavaScript di Chrome) utilizza classi nascoste come parte della sua strategia di ottimizzazione. Naturalmente, JS non ha classi, quindi il layout degli oggetti è più complicato in V8.

Il layout degli oggetti in V8 richiede un minimo di 3 parole nell'intestazione. Al contrario, la Dart VM richiede solo 1 parola nell'intestazione. La dimensione e la struttura di un oggetto Dart sono conosciute al momento della compilazione.Questo è molto utile per i progettisti VM.

Un altro esempio: in Dart sono presenti elenchi reali (ovvero matrici). Puoi avere una lista di lunghezza fissa, che è più facile da ottimizzare rispetto ai non-array di JavaScript e sempre a lunghezze variabili.

Per saperne di più sulla compilazione Dart (e JavaScript) per codice efficiente con questa presentazione: http://www.dartlang.org/slides/2013/04/compiling-dart-to-efficient-machine-code.pdf

dimensione Un'altra prestazione è il tempo di start-up. Man mano che le app web diventano più complesse, il numero di righe di codice aumenta. Il design di JavaScript rende più difficile ottimizzare l'avvio, poiché l'analisi e il caricamento del codice eseguono anche il codice. In Dart, il linguaggio è stato accuratamente progettato per renderlo veloce da analizzare. Dart non esegue il codice mentre carica e analizza i file.

Ciò significa anche che le macchine virtuali Dart possono memorizzare nella cache una rappresentazione binaria dei file analizzati (nota come snapshot) per un avvio ancora più rapido.

Problemi correlati