Ho un requisito insolito: la mia applicazione genera automaticamente il codice Java da uno script molto lungo (scritto in un linguaggio tipizzato dinamicamente). La sceneggiatura è così lunga che ho raggiunto lo the maximum method size of 65k of the JVM.Java - Come superare la dimensione massima del metodo nel codice generato automaticamente
Lo script consiste solo di semplici istruzioni sui tipi primitivi (nessuna chiamata ad altre funzioni oltre a quelle matematiche). Può sembrare:
...
a = b * c + sin(d)
...
if a>10 then
e = a * 2
else
e = a * abs(b)
end
...
... che si trasforma come:
...
double a = b * c + Math.sin(d);
...
double e;
if(a>10){
e = a * 2;
}else{
e = a * Math.abs(b);
}
...
La mia prima idea per superare la limitazione metodo size è stato il seguente:
- Girare tutto variabili locali nei campi
- Dividere il codice ogni 100 righe (o più lungo se necessario in caso di un blocco if/else) in settembre metodi arati.
Qualcosa di simile:
class AutoGenerated {
double a,b,c,d,e,....;
void run1(){
...
a = b * c + sin(d);
...
run2();
}
void run2(){
...
if(a>10){
e = a * 2;
}else{
e = a * Math.abs(b);
}
...
run3();
}
...
}
Sapete di qualsiasi altro modo che sarebbe più efficace? Si noti che ho bisogno che il codice venga eseguito il più velocemente possibile in quanto verrà eseguito in loop lunghi. Non posso ricorrere alla compilazione in C, poichè l'interoperabilità è anche un problema ...
Apprezzerei anche i puntatori alle librerie che potrebbero aiutarmi.
Se si è preoccupati dell'efficienza, è necessario tenere presente che i metodi con dimensioni superiori a 8 KB non vengono compilati per impostazione predefinita. –
Vorrei prendere in considerazione ciò che l'inlining può fare per te. Ci sono sequenze di codice ripetitive che, dopo l'inline, producono lo stesso codice? –
@PeterLawrey, cosa succede poi oltre 8 KB? Il codice è interpretato, costa un sacco di efficienza? Cosa rende il compilatore decidere cosa dovrebbe compilare o no? Riguardo * inlining *, come funzionerebbe esattamente? Dovrei cercare "patterns" nel codice e creare metodi dedicati per gestirli? –