Какой был бы более эффективный способ отправки для того, чтобы ускорить выполнение кода fetch-decode?Каков наиболее эффективный способ отправки виртуальной машины?
Для простоты я сохранил это как минимум, так как операции работают с 1 байтовыми операндами, и их, например, всего два.
метод я использую в данный момент (упрощенно) является:
typedef unsigned char byte;
vector<byte> _program = { INST::PUSH, 32, INST::POP};
enum INST {
PUSH =0, /*index=0*/
POP =1, /*index=1*/
}
//DISPATCHING METHOD #1
switch (curr_instruction) {
case INST::PUSH: {
/*declared inline*/ _push_to_stack(_program[instr_ptr+1]);
}
case INST::POP: {
/*declared inline*/ _pop_stack();
}
}
ИЛИ с помощью таблицы указателя функции для выполнения каждой инструкции в «программе» (вектор байт/vector _program
), как и :
typedef void (*voidptr)();
void hndl_push(){
/*declared inline*/ _push_to_stack(_program[instr_ptr+1]);
}
void hndl_push(){
/*declared inline*/ _pop_stack();
}
funcptr handlers[2] = {&hndl_push /*index=0*/, & hdnl_pop /*index=1*/}'
vector<byte> _program = { INST::PUSH, 32, INST::POP};
size_t instr_ptr=0;
//DISPATCHING METHOD #2
while (instr_ptr != _program.size()){
instr_ptr++;
_handlers[instr_ptr]();
}
Я использую компилятор VC++ (Visual Studio), версия 2015 года.
Какое из них преобразуется в более эффективный ассемблер с наименьшими издержками или они одинаковы?
Спасибо заранее!
Это так хорошо, как только это получится. Вы можете работать только быстрее, генерируя машинный код с компилятором точно в срок. Это было сделано. –
@HansPassant Но это быстрее? – SolaGratia