Domanda

C'è qualcuno usando i trucchi JIT per migliorare le prestazioni di runtime di linguaggi compilati staticamente come il C ++? Sembra che l'analisi hotspot e predizione dei salti sulla base di osservazioni fatte durante l'esecuzione potrebbe migliorare le prestazioni di qualsiasi codice, ma forse c'è una ragione strategica fondamentale perché fare queste osservazioni e modifiche durante il runtime attuazione sono possibili solo in macchine virtuali. Ricordo distintamente ascoltando C ++ scrittori compilatore mutter "si può fare per i programmi scritti in C ++ troppo" durante l'ascolto di appassionati di linguaggio dinamico parlare di raccolta di dati statistici e riorganizzare il codice, ma le mie ricerche web per prove a sostegno di questa memoria sono venuto a secco.

È stato utile?

Soluzione

Profilo guidata ottimizzazione è diverso da ottimizzare l'autonomia. L'ottimizzazione è ancora fatto in linea, sulla base di informazioni di profilo, ma una volta che il file binario viene spedito non c'è l'ottimizzazione in corso, quindi, se i modelli di utilizzo della fase di ottimizzazione del profilo-guida non riflettono con precisione l'uso nel mondo reale, allora i risultati saranno imperfetta, e il programma, inoltre, non si adatta a diversi modelli di utilizzo.

Si può essere interessante in cerca di informazioni su di HP Dynamo , anche se questo sistema si è concentrato sul binario nativo -.> nativo di traduzione binaria, anche se dal C ++ è quasi esclusivamente compilato in codice nativo suppongo che sia esattamente quello che stai cercando

Si potrebbe anche voler dare un'occhiata a LLVM , che è un framework compilatore e rappresentazione intermedia che supporta JIT ottimizzazione compilazione e di runtime, anche se non sono sicuro se ci sono in realtà alcun runtime LLVM-based che può compilare C ++ ed eseguire + runtime ottimizzare ancora.

Altri suggerimenti

L'ho fatto quel tipo di ottimizzazione un bel po 'negli ultimi anni. E 'stato per un API di rendering grafico che ho implementato. Poiché l'API definita diverse migliaia di differenti modalità di disegno come funzione obiettivo generale era modo per rallentare.

ho finito per scrivere la mia piccola Jit-compilatore per un linguaggio specifico dominio (molto vicino a asm, ma con alcune strutture di controllo di alto livello e le variabili locali gettati in).

Il miglioramento delle prestazioni ho ottenuto è stato tra il fattore 10 e 60 (dipendeva dalla complessità del codice compilato), in modo che il lavoro extra ripagato alla grande.

Sul PC non vorrei cominciare a scrivere il mio JIT-compilatore, ma utilizzare sia LIBJIT o LLVM per la compilazione JIT. Non è stato possibile nel mio caso a causa del fatto che stavo lavorando su un processore embedded non tradizionale che non è supportato da LIBJIT / LLVM, così ho dovuto inventare la mia.

La risposta è più probabile:. Nessuno ha fatto più di PGO per C ++, perché i benefici sono probabilmente impercettibile

Vorrei esporre: JIT motori / runtime avere entrambe le benedice e svantaggi dal punto di vista di loro sviluppatore: essi hanno più informazioni in fase di esecuzione, ma molto poco tempo per analizzare. Alcune ottimizzazioni sono molto costoso e si improbabile vedere senza un enorme impatto sul tempo di inizio sono quelli uno simile: svolgimento del ciclo, auto-vettorizzazione (che nella maggior parte dei casi si basa anche sul circuito di svolgimento), la selezione di istruzioni (da utilizzare per SSE4.1 CPU che utilizzano SSE4.1) in combinazione con la pianificazione delle istruzioni e riordino (per usare le CPU più super-scalari). Questo tipo di ottimizzazioni combinano grande con C come il codice (che è accessibile da C ++).

La singola architettura conclamata compilatore per fare la compilazione avanzate (per quanto ne so) è il Java Hotspot compilazione e architetture con principi simili che utilizzano la compilazione a più livelli (Java Azul 's sistemi, il popolare per il giorno JaegerMonkey JS engine).

Ma una delle più grandi ottimizzazione on runtime è il seguente:

polimorfico inline caching (il che significa che se si esegue il primo ciclo con alcuni tipi, la seconda volta, il codice del ciclo sarà specializzata tipi che erano dal ciclo precedente e del JIT inserirà una guardia e metterà ramo come difetto tipi inline, e sulla base di esso, a questa forma specializzata utilizzando un SSA motore -form basato applicherà costante di piegatura / propagazione, inlining , ottimizzazioni dead-code-eliminazione, e dipende di come "avanzata" JIT è, farà un incarico registro CPU migliorata o meno migliorata.) Come si può notare, il JIT (hotspot) miglioreranno la maggior parte del codice ramoso, e con informazioni di runtime otterrà meglio di un codice C ++, ma un compilatore statico, avendo al suo fianco il momento di fare analisi , istruzioni riordino, per semplici cicli, sarà probabilmente ottenere un po 'meglio le prestazioni. Inoltre, in genere, il codice C ++, le aree che hanno bisogno di essere veloce tende a non essere OOP, quindi le informazioni del JIT ottimizzazioni non porterà un tale miglioramento sorprendente.

Un altro vantaggio di squadre investigative comuni è che JIT funziona assemblee croce, così ha più informazioni, se vuole fare inlining.

Vorrei esporre: diciamo che hai una classe di base A e si ha solo l'attuazione di esso e cioè B in un altro pacchetto / montaggio / gemma / etc. e viene caricato in modo dinamico.

JIT come si vede che B è l'unica implementazione di A, può sostituire in tutto il mondo nella sua rappresentazione interna della A chiama con i codici B, e le chiamate di metodo non farà un dispaccio (sguardo il vtable), ma saranno chiamate dirette. Quelle chiamate dirette possono essere inline anche. Ad esempio questo B ha un metodo: getLength() che restituisce 2, tutte le chiamate di getLength() può essere ridotto a 2 costante dappertutto. Alla fine un codice C ++ non sarà in grado di saltare la chiamata virtuale di B da un'altra DLL.

Alcune implementazioni di C ++ non supportano per ottimizzare su più file cpp (anche oggi c'è la bandiera -lto nelle versioni recenti di GCC che rende questo possibile). Ma se sei un C ++ sviluppatore, preoccupati per la velocità, è probabile che mettono i tutte le classi sensibili nella stessa libreria statica o addirittura nello stesso file, in modo che il compilatore può inline piacevolmente, rendendo le informazioni extra che JIT ce l'ha da disegno , che devono essere fornite dallo sviluppatore stesso, quindi senza perdita di prestazioni.

visual studio ha un'opzione per fare il profiling di runtime che quindi può essere utilizzato per l'ottimizzazione del codice.

"Profilo Guided Optimization"

Microsoft Visual Studio chiama " profilo ottimizzazione guidata "; si può imparare di più riguardo a MSDN . In sostanza, si esegue il programma di un mucchio di volte con un profiler attaccato per registrare i suoi hotspot e altre caratteristiche di prestazione, e quindi è possibile alimentare l'uscita del profiler nel compilatore per ottenere ottimizzazioni appropriate.

LLVM tenta di fare un po 'di questo. Si tenta di ottimizzare tutta la durata del programma (compile-time, link-tempo, e run-time).

domanda ragionevole - ma con una premessa dubbia

.

Come in risposta Nils', a volte 'ottimizzazione' significa 'l'ottimizzazione di basso livello', che è un bel soggetto a sé stante.

Tuttavia, si basa sul concetto di "hot-spot", che ha in nessun posto vicino la rilevanza è comunemente dato.

Definizione:. Un hot-spot è una piccola regione di codice in cui contatore di programma di un processo spende una grande percentuale del suo tempo

Se c'è un hot-spot, come ad esempio un ciclo interno stretto che occupa un sacco di tempo, vale la pena cercando di ottimizzare al livello basso, se è nel codice che si controlla (cioè non in una terza parte biblioteca).

Ora supponiamo che ciclo interno contiene una chiamata a una funzione, qualsiasi funzione. Ora il contatore di programma non è probabile che vi si trovano, perché è più probabile che sia nella funzione. Così, mentre il codice può essere uno spreco, non è più un hot-spot.

Ci sono molti modi comuni per fare il software lento, di cui hot-spot sono uno. Tuttavia, nella mia esperienza, che è l'unico di cui la maggior parte dei programmatori sono a conoscenza, e l'unico al quale si applica l'ottimizzazione di basso livello.

vedere questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top