Il mio progetto ha una VM che esegue un codice byte compilato da un linguaggio specifico del dominio. Sto osservando i modi in cui posso migliorare il tempo di esecuzione del codice byte. Come primo passo vorrei vedere se c'è un modo per migliorare semplicemente l'interprete byte-code prima di entrare nella compilazione del codice macchina.Ciclo interprete virtual machine/byte code ottimale
Il ciclo principale dell'interprete si presenta così:
while(true)
{
uint8_t cmd = *code++;
switch(cmd)
{
case op_1: ...; break;
...
}
}
DOMANDA: C'è un modo più veloce per implementare questo ciclo senza ricorrere a Assembler?
L'unica opzione che vedo è GCC specifica per utilizzare goto dinamico con indirizzi di etichette. Piuttosto che un break
alla fine di ogni caso, potrei passare direttamente all'istruzione successiva. Speravo che l'ottimizzatore avrebbe fatto questo per me, ma a quanto pare lo smontaggio non lo fa: c'è un salto costante ripetuto alla fine della maggior parte dei op_codes.
Se rilevante, la macchina virtuale è una macchina basata su registri semplice con registri in virgola mobile e interi (8 di ciascuno). Non c'è stack, solo un heap globale (quella lingua non è così complicata).
È altamente improbabile che le chiamate di funzione anziché lo switch siano più veloci (le chiamate di funzione hanno un sovraccarico significativo). Lo switch dovrebbe comunque essere compatibile con un jump-table (GCC lo fa almeno). –
Cool, non sapevo che su gcc, ma in ogni caso, si potevano definire funzioni come inline, e invece di passare qualsiasi argomento le rendeva variabili globali e così via, rendendo la funzione chiamata overhead molto piccola. Ovviamente, quando si arriva a questo livello è probabilmente più facile codificare tutto in assembler. (Se si sa come farlo.) – Cray
Non è possibile effettuare chiamate in linea effettuate tramite una tabella di invio. L'opzione più vicina qui è quella di utilizzare gli indirizzi delle etichette GCC, che in pratica consentono di creare le proprie funzioni inline in una tabella di salto. –