Мы пишем байт-код для высокоуровневого скомпилированного языка, а после небольшого профилирования и оптимизации выяснилось, что текущие наибольшие издержки по производительности - это оператор switch, который мы используем, чтобы перейти к байт- кода.
Мы исследовали вытягивание адреса метки каждого случая и сохранение его в потоке самого байтового кода, а не идентификатор команды, который мы обычно включаем. Если мы это сделаем, мы сможем пропустить таблицу перехода и сразу перейдем к расположению кода исполняемой команды. Это работает фантастически в GCC, однако MSVC, похоже, не поддерживает такую функцию.
Мы попытались использовать встроенную сборку, чтобы захватить адрес ярлыков (и перейти к ним), и он работает, однако, используя встроенную сборку, исключает оптимизацию всей функции оптимизатором MSVC.
Есть ли способ разрешить оптимизатору работать над кодом? К сожалению, мы не можем извлечь встроенную сборку в другую функцию, отличную от той, в которую были сделаны метки, поскольку нет способа ссылаться на метку для другой функции даже в встроенной сборке. Любые мысли или идеи? Ваш вклад очень ценится, спасибо!