Как эффективно переключать большое количество дел с крайне перекошенным распределением?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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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