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