Оптимизация ветвления - PullRequest
       6

Оптимизация ветвления

0 голосов
/ 27 августа 2009

Какова лучшая реализация с точки зрения производительности вызовов разветвленных функций?

В наивном случае мы имеем довольно большой оператор switch, который интерпретирует байт-код и выполняет вызов функции в зависимости от кода.

В обычном случае мы вычислили gotos и метки, которые делают то же самое.

Какой самый лучший способ сделать это?

Абстрактный пример,

schedule: 
    swap_entity();
    goto *entity_start();

lb_code1:
    do_stuff();
    goto *next_code_item();

lb_code2:
    do_stuff();
    goto *next_code_item();

...

Редактировать: Моя ссылка на "разветвленные вызовы функций" была, возможно, несколько ошибочной. Выполнение разветвленного кода.

Ответы [ 3 ]

3 голосов
/ 27 августа 2009

Может быть, массив указателей на функции, в предположении:

void dispatch(Message* message)
{
  //MessageType is a finite enum
  MessageType messageType = message->messageType;
  int index = (int)messageType;
  //there's an array element for each enum value
  FunctionPointer functionPointer = arrayOfFunctionPointers[index];
  (*functionPointer)(message);
}

Фактический ответ зависит от оборудования и зависит от таких факторов, как размер проблемы и кэш-память ЦП.

2 голосов
/ 27 августа 2009

Это зависит. Некоторые подходы, основанные на таблицах, обычно бывают самыми быстрыми, но вы можете обнаружить, что именно так реализован ваш оператор switch. Конечно, вы должны не воспринимайте как ЛЮБУЮ рекомендацию в этой области из пользователей SO это самое лучшее. Если мы что-то предложим, вам нужно реализовать это и измерить производительность в сборке со всеми включенными оптимизациями компилятора.

1 голос
/ 27 августа 2009

Если вы ищете здесь повышение скорости, вам следует взглянуть на другие механизмы распределения байт-кода. Был вопрос, который как бы задавал этот вопрос до .

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

Я дал дополнительные ресурсы в другом вопросе.

...