Я в дилемме, что будет более эффективным вариантом для цикла виртуальной машины:
Вариант 1 — принудительное выполнение встроенных функций инструкций, использование вычисленного перехода для переключения для вызова (эффективно встроенного кода) инструкции на этой метке … или …
вариант 2 — использовать массив поиска указателей на функции, каждый из которых указывает на fastcall
функция, а инструкция определяет индекс.
В основном, что лучше, таблица поиска с адресами перехода и встроенным кодом или таблица поиска с fastcall
функциональные адреса. Да, я знаю, что оба — просто адреса памяти и переходы назад и вперед, но я думаю, fastcall
может по-прежнему вызывать передачу некоторых данных в стек, если они находятся вне пространства регистров, даже если они вынуждены использовать регистры для параметров.
Компилятор GCC.
Я предполагаю, что под «виртуальной машиной» вы подразумеваете имитируемый процессор, выполняющий некоторый байт-код, похожий на «виртуальную машину Java», а не целый имитированный компьютер, который позволяет устанавливать другую ОС (как в VirtualBox / VMware) ,
Мое предложение состоит в том, чтобы позволить компилятору принять решение о том, что имеет лучшую производительность, и создать большой традиционный «переключатель» для текущего элемента потока байтового кода. Это, скорее всего, приведет к созданию таблицы переходов, созданной компилятором, поэтому она будет такой же быстрой (или медленной), как ваш вычисленный вариант goto, но более переносимой.
Ваш вариант 2 — поиск в массиве указателей на функции — скорее всего, медленнее, чем встроенные функции, так как при использовании не встроенных функций возможны дополнительные издержки, такие как обработка возвращаемых значений. В конце концов, некоторые из ваших функций VM-op (например, «goto» или «set-register-to-немедленный») должны изменить указатель инструкции, а другие — нет.
Как правило, вызовы указателей на функции (или переходы через таблицу переходов) медленны на современных процессорах, так как их трудно предсказать с помощью предсказания ветвлений. Итак, если вы думаете об оптимизации вашей виртуальной машины, попробуйте найти набор инструкций, для которых требуется как можно меньше кодов.
Других решений пока нет …