J'ai un compilateur qui vise LLVM, et je fournir deux façons d'exécuter le code:
- Exécuter automatiquement. Ce mode compile le code de LLVM et utilise le ExecutionEngine JIT compiler en code machine sur-le-champ et de l'exécuter sans jamais générer un fichier de sortie.
- Le compiler et l'exécuter séparément. Ce mode génère un LLVM .bc fichier, que j'optimiser manuellement (avec
opt
), les compiler en natif de l'assemblée (avecllc
) compiler en code machine et un lien (avecgcc
), et de l'exécuter.
Je m'attendais à une approche #2 pour être plus rapide que l'approche #1, ou au moins à la même vitesse, mais l'exécution de quelques tests de vitesse, je suis surpris de constater que le n ° 2 de manière cohérente fonctionne environ deux fois plus lent. C'est une énorme différence de vitesse.
Les deux cas sont en cours d'exécution de la même LLVM code source. Avec l'approche n ° 1, je n'ai pas encore pris la peine de courir tout LLVM optimisation de passe (c'est pourquoi je m'attendais à être plus lent). Avec l'approche n ° 2, je suis en cours d'exécution opt
avec -std-compile-opts
et llc
avec -O3
, pour maximiser l'optimisation, mais il n'est pas d'obtenir n'importe où près de #1. Voici un exemple d'exécution du même programme:
- #1 sans optimisation: 11.833 s
- #2 sans optimisation: 22.262 s
- #2 avec optimisation (
-std-compile-opts
et-O3
): 18.823 s
Est le ExecutionEngine de faire quelque chose de spécial que je ne le sais pas? Est-il possible pour moi d'optimiser le code compilé pour obtenir la même performance que le ExecutionEngine JIT?