El artículo analiza el uso de la extensión computed goto de GCC como alternativa a la sentencia switch para implementar el bucle principal de una máquina virtual basada en bytecode. Primero define una máquina virtual mínima escrita en C que opera sobre un único entero con instrucciones como incremento, decremento, multiplicación por dos, división por dos, suma de siete y negación, presentada en su versión clásica con switch.
A continuación muestra la misma máquina virtual reescrita con computed goto: una tabla de punteros a etiquetas que se indexa con el opcode y se invoca mediante goto indirecto. El autor aporta una comparativa de rendimiento con código disponible en GitHub: en su benchmark, la versión con goto es un 25 % más rápida que la versión con switch; además, los comentarios del código fuente de CPython indican que esta técnica acelera el intérprete de Python entre un 15 % y un 20 %.
La ventaja se explica por dos motivos. El primero es que la versión con switch realiza una comprobación de límites adicional en cada iteración para cumplir con el estándar C99, mientras que la versión con computed goto se ahorra ese paso. El segundo es la predicción de saltos del procesador: el switch genera un único salto maestro cuya dirección de destino es difícil de predecir, mientras que computed goto produce un salto independiente por cada opcode, lo que facilita la labor del predictor. El texto incluye desensamblado anotado de ambas versiones compiladas con GCC -O3 para quien quiera profundizar en los detalles de bajo nivel.
