Skip to content

Repository files navigation

Comparação de dispatch em uma mini-VM MIPS

Este repositório documenta um experimento comparando duas estratégias de dispatch para interpretadores de bytecode:

  • switch dispatch
  • direct threading

A conclusão final do trabalho é deliberadamente equilibrada:

  • o direct threading reduz o número estrutural de branches no ponto de dispatch;
  • no benchmark em C deste host, ele também foi mais rápido;
  • ainda assim, a análise visual e estrutural mostra que o switch permanece a escolha mais defensável para uma JVM acadêmica pequena, por simplicidade, rastreabilidade, portabilidade e facilidade de manutenção.

Em outras palavras, o experimento não tenta negar a vantagem estrutural do threading. Ele mostra por que, mesmo reconhecendo essa vantagem, ainda faz sentido escolher switch dispatch em uma implementação didática.

Resumo executivo

Fonte Resultado principal
DrMIPS, vídeo do switch fluxo linear, previsível, fácil de rastrear no datapath
MARS + MIPS X-Ray, vídeo do direct threading salto indireto real via jump table, com rota mais curta no dispatch
MARS, contadores estruturais switch = 23000 branches de dispatch; threading = 8000
Benchmark em C no host threading foi mais rápido nesta máquina
Decisão arquitetural do projeto switch dispatch continua sendo a opção recomendada para a JVM acadêmica

Estrutura do repositório

Artefato Papel no experimento
vm_dispatch_compare.asm comparador principal em MIPS com as duas estratégias no mesmo arquivo
vm_dispatch_compare.c benchmark complementar em C para CPU real
MIPS/switch_dispatch_drmips.asm versão switch adaptada para DrMIPS
MIPS/direct_threading_dispatch_mars_spim.asm versão direct threading para MARS/SPIM
Videos/ vídeos e frames usados na análise visual
Uso_Grafico_mars/ capturas reais do MARS
Graficos_Comparativos/ gráficos consolidados do experimento
Dados_Experimento/ tabelas e resumos numéricos finais

Vídeos analisados

Método Prévia Leitura principal
switch dispatch no DrMIPS Switch no DrMIPS o PC percorre um conjunto ordenado de comparações até encontrar o handler correto
direct threading no MARS X-Ray Direct threading no MARS X-Ray o opcode vira índice, acessa a jump table e salta diretamente para o handler com jr

Os dois vídeos têm papéis diferentes:

  • o vídeo do DrMIPS é melhor para explicar o comportamento do switch no datapath;
  • o vídeo do MARS X-Ray é melhor para mostrar a mecânica real do direct threading, já que o DrMIPS usado no experimento não suporta bem esse padrão de salto indireto.

Métodos comparados

Aspecto Switch dispatch Direct threading
Seleção do handler cadeia de comparações beq jump table + jr
Ponto de despacho centralizado distribuído
Estrutura auxiliar em memória não precisa precisa de thread_table
Portabilidade em C/C++ total depende de técnica mais específica
Rastreabilidade didática muito alta alta, mas menos linear
Aderência ao DrMIPS alta limitada

O que a análise visual mostrou

1. Switch dispatch no DrMIPS

No vídeo do switch, a execução é dominada por um fluxo sequencial muito claro:

  1. leitura do opcode da mini-VM;
  2. avanço do ponteiro de instrução virtual;
  3. comparações sucessivas no laço de dispatch;
  4. entrada no handler correto;
  5. retorno ao laço central.

Essa visualização reforça quatro características importantes:

  • o fluxo de controle é explícito;
  • o ponto de despacho é único;
  • a depuração fica mais simples;
  • o mapeamento mental entre o código C/C++ e o assembly MIPS é direto.

A principal virtude observada aqui não foi “menos branches”, porque isso não ocorre. A virtude foi a clareza estrutural do mecanismo.

2. Direct threading no MARS X-Ray

No vídeo do direct threading, o fluxo é diferente:

  1. o opcode é lido;
  2. ele é transformado em índice com sll;
  3. a base da thread_table é carregada;
  4. o endereço do handler é buscado na memória;
  5. o salto indireto é executado com jr.

Essa rota deixa duas propriedades muito claras:

  • o dispatch é mais curto em termos de branches explícitos;
  • o mecanismo depende de uma estrutura auxiliar em memória e de um salto indireto real.

Visualmente, o threading é mais compacto no ponto de despacho. Estruturalmente, porém, ele também é mais “acoplado” à jump table e menos linear para explicação em sala.

3. O que os vídeos provam, e o que eles não provam

Os vídeos mostram Os vídeos não mostram sozinhos
forma do fluxo de controle desempenho absoluto em CPU moderna
diferença entre cadeia de beq e jump table branch predictor real do hardware
dependência do threading em salto indireto branch misses reais
facilidade de rastrear o switch superioridade universal de uma técnica

Essa separação é importante para a defesa: os vídeos servem como evidência qualitativa e estrutural, não como medição definitiva de performance.

Evidência estrutural no MARS

As duas implementações foram validadas funcionalmente e produziram o mesmo estado final:

  • vm_mem[0] = 25
  • topo final da pilha = 25

Saída final do programa no MARS

Resumo quantitativo do MARS

Métrica Switch Threading
Bytecodes executados 8000 8000
Branches de dispatch 23000 8000
Diferença de branches 15000
Jump table no .data 0 bytes 24 bytes
Resultado final vm_mem[0] 25 25
Topo final da pilha 25 25

Resumo das métricas observadas no MARS

Leitura correta desses números

  • o direct threading venceu estruturalmente no número de branches de dispatch;
  • o switch venceu em simplicidade de layout e de inspeção;
  • as duas abordagens preservaram exatamente a correção funcional do interpretador.

Branches de dispatch observados no MARS

Layout de memória e impacto da jump table

Uma das diferenças mais úteis para a defesa do projeto aparece na memória:

  • o switch não introduz nenhuma estrutura auxiliar de roteamento;
  • o threading precisa de uma thread_table explícita.

Isso não é um problema técnico em si. Mas, para uma JVM acadêmica pequena, adiciona mais um elemento estrutural que precisa ser mantido consistente com o valor numérico dos opcodes.

Painel de memória do MARS

Comparação das estruturas auxiliares de dispatch

Rastreabilidade no código

No MARS, o switch é particularmente forte em dois pontos:

  • o dispatch está todo concentrado em um único laço;
  • o avanço do PC é fácil de demonstrar com breakpoints e stepping.

Área de código no MARS

Painel de registradores do MARS

Benchmark complementar em C

O benchmark em C foi mantido como contraste com hardware real do host.

Resumo do benchmark no host

Métrica Switch Threading
Execuções 7 7
Bytecodes processados 160000000 160000000
Branches modelados 460000000 160000000
Tempo médio de parede 210.00 ms 154.29 ms
RSS médio 1431 KB 1440 KB
Tamanho do binário 16280 bytes 16400 bytes

Resumo comparativo do benchmark em C

Os gráficos abaixo deixam esse contraste mais claro:

Tempo de execução no host

Branches modelados no host

Memória RSS no host

Como interpretar esse resultado sem distorcer a tese

O benchmark em C mostrou que, nesta máquina, o direct threading foi mais rápido. Isso precisa ser dito com clareza.

Ao mesmo tempo, esse resultado não anula a defesa do switch para a JVM acadêmica, porque o objetivo da escolha arquitetural aqui não é maximizar um único indicador de velocidade local. O objetivo é equilibrar:

  • clareza de implementação;
  • facilidade de depuração;
  • previsibilidade estrutural;
  • portabilidade;
  • qualidade da defesa técnica do projeto.

Síntese das fontes de evidência

Fonte O que ela sustenta melhor
Vídeo do DrMIPS clareza e linearidade do switch dispatch
Vídeo do MARS X-Ray mecânica real do direct threading
Tabelas do MARS diferença estrutural de branches e custo da jump table
Benchmark em C contraste de desempenho no host real

Essa combinação levou a uma conclusão mais madura do que uma simples comparação “qual é mais rápido”.

Conclusão arquitetural

O experimento mostrou três coisas ao mesmo tempo:

  1. direct threading reduz branches de dispatch e torna o salto ao handler mais direto;
  2. no benchmark em C deste host, ele foi mais rápido;
  3. ainda assim, o switch dispatch continua sendo a melhor escolha de engenharia para esta JVM acadêmica.

Essa recomendação final se apoia em cinco argumentos:

  • o switch é mais simples de explicar e auditar;
  • o fluxo do interpretador fica mais visível em simulação;
  • o projeto evita dependência de jump table como estrutura de roteamento;
  • a implementação permanece mais próxima de C/C++ padrão;
  • a manutenção e a defesa oral da arquitetura ficam mais seguras.

Portanto, a posição final deste repositório não é “threading não funciona”. A posição é mais precisa:

Em uma mini-VM acadêmica, com ISA pequena e foco em legibilidade, rastreabilidade e robustez da implementação, o switch dispatch é a escolha arquitetural mais adequada, mesmo reconhecendo a vantagem estrutural do direct threading no ponto de despacho.

Arquivos finais para reprodução

  • vm_dispatch_compare.asm
  • vm_dispatch_compare.c
  • MIPS/switch_dispatch_drmips.asm
  • MIPS/direct_threading_dispatch_mars_spim.asm
  • Videos/switch_dispatch_drmips.mp4
  • Videos/direct_threading_mars_xray.mp4
  • Dados_Experimento/mars_summary.csv
  • Dados_Experimento/metricas_resumo.csv

Os demais arquivos visuais e gráficos servem como material pronto para apresentação e relatório.

Licença

Este repositório usa a licença The Unlicense, permitindo cópia, modificação, redistribuição e uso irrestrito, inclusive para trabalhos derivados, sem necessidade de pedir autorização prévia.

About

Comparative analysis of switch dispatch and direct threading in a MIPS mini-VM

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages