Как эффективно переключать большое количество дел с крайне перекошенным распределением?C++

Программы на C++. Форум разработчиков
Anonymous
Как эффективно переключать большое количество дел с крайне перекошенным распределением?

Сообщение Anonymous »

У нас есть сервис, который при отправке нам сообщений включает код ошибки uint8_t. С несколькими сотнями возможных кодов. В нашем приложении мы преобразуем это примерно в 8 категорий ошибок в классе перечисления, т. е. enum class error_type { A, B, C, ....
Это очень просто сделать, какой-то вариант:

Код: Выделить всё

error_type translate_error_type(uint8_t error_code) {
switch(error_code) {
case 0: return error_type::A;
case 1: return error_type::D;
// ... hundreds of more cases to deal with.  Unforturnely not a good translation between error_codes and our internal classes over ranges of error_code values to make optimization easy.
}
}
Однако в реальных данных около 5 случаев почти полностью доминируют.
Как бы вы написали эту функцию, чтобы компилятор (gcc11 в данном конкретном случае) генерировал лучший код, чем одна огромная таблица переходов, для оптимизации задержки в случае срабатывания одного из пяти доминирующих случаев? Или, по сути, одна огромная таблица переходов — это лучшее, что может сделать компилятор?
Примечание: к сожалению, глядя на сгенерированную сборку в gcc для маркировки случаев [[вероятно]], я не верю, что это работает хорошо, если несколько случаев помечены как вероятные.

Подробнее здесь: https://stackoverflow.com/questions/799 ... stribution

Вернуться в «C++»