我正在学习Android Dalvik虚拟机,当我阅读vm/mterp/out/InterpC-portable.cpp文件中的mterp代码时遇到了一个问题。实际上,这是Dalvik虚拟机的主解释器循环,用于解释dex文件中的字节码。如果我编写这个文件,我会选择switch-case结构来完成以下操作:
while (hasMoreIns()) {
int ins = getNextIns();
switch(ins) {
case MOV:
//interprete this instruction
...
break;
case ADD:
...
break;
...
default: break;
}
}
然而,mterp使用的方式与我的想法非常不同,它使用了一些我认为是神奇的代码,例如:
FINISH(0);
HANDLE_OPCODE(OP_NOP)
FINISH(1);
OP_END
HANDLE_OPCODE(OP_MOVE)
...
OP_END
...
我谷歌了一下,发现它似乎是一种修改过的“线程化”执行方式,与switch-case风格不同,因为它在while循环中删除了分支操作,所以性能更好。但我仍然无法理解这段代码以及为什么它在性能方面更好。它是如何找到下一个要解释的代码的呢?