Что стоит больше, вычисляется goto / jump vs fastcall через указатель на функцию?

Я в дилемме, что будет более эффективным вариантом для цикла виртуальной машины:

Вариант 1 — принудительное выполнение встроенных функций инструкций, использование вычисленного перехода для переключения для вызова (эффективно встроенного кода) инструкции на этой метке … или …

вариант 2 — использовать массив поиска указателей на функции, каждый из которых указывает на fastcall функция, а инструкция определяет индекс.

В основном, что лучше, таблица поиска с адресами перехода и встроенным кодом или таблица поиска с fastcall функциональные адреса. Да, я знаю, что оба — просто адреса памяти и переходы назад и вперед, но я думаю, fastcall может по-прежнему вызывать передачу некоторых данных в стек, если они находятся вне пространства регистров, даже если они вынуждены использовать регистры для параметров.

Компилятор GCC.

1

Решение

Я предполагаю, что под «виртуальной машиной» вы подразумеваете имитируемый процессор, выполняющий некоторый байт-код, похожий на «виртуальную машину Java», а не целый имитированный компьютер, который позволяет устанавливать другую ОС (как в VirtualBox / VMware) ,

Мое предложение состоит в том, чтобы позволить компилятору принять решение о том, что имеет лучшую производительность, и создать большой традиционный «переключатель» для текущего элемента потока байтового кода. Это, скорее всего, приведет к созданию таблицы переходов, созданной компилятором, поэтому она будет такой же быстрой (или медленной), как ваш вычисленный вариант goto, но более переносимой.

Ваш вариант 2 — поиск в массиве указателей на функции — скорее всего, медленнее, чем встроенные функции, так как при использовании не встроенных функций возможны дополнительные издержки, такие как обработка возвращаемых значений. В конце концов, некоторые из ваших функций VM-op (например, «goto» или «set-register-to-немедленный») должны изменить указатель инструкции, а другие — нет.

Как правило, вызовы указателей на функции (или переходы через таблицу переходов) медленны на современных процессорах, так как их трудно предсказать с помощью предсказания ветвлений. Итак, если вы думаете об оптимизации вашей виртуальной машины, попробуйте найти набор инструкций, для которых требуется как можно меньше кодов.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]