Недавно я прочитал здесь вопрос Почему это быстрее обрабатывать отсортированный массив, а не несортированный? и нашел ответ абсолютно захватывающим, и он полностью изменил мой взгляд на программирование при работе с ветвями, основанными на данных.
В настоящее время у меня есть довольно простой, но полностью функционирующий интерпретируемый эмулятор Intel 8080, написанный на C, сердцем операции является 256-длинная таблица переключателей для обработки каждого кода операции. Моя первоначальная мысль заключалась в том, что это, очевидно, будет самый быстрый метод работы, поскольку кодирование кода операции не согласовано во всем наборе инструкций 8080, а декодирование добавит много сложности, несогласованности и одноразовых случаев. Таблица switch-case, заполненная макросами препроцессора, очень аккуратна и проста в обслуживании.
К сожалению, после прочтения вышеупомянутого поста мне пришло в голову, что предсказатель ветвления на моем компьютере абсолютно никак не может предсказать переход для случая переключения. Таким образом, каждый раз, когда переключается случай, конвейер должен быть полностью очищен, что приводит к задержке в несколько циклов в том, что в противном случае должно быть невероятно быстрой программой (в моем коде нет даже умножения).
Я уверен, что большинство из вас думает: «О, решение здесь простое, перейдите к динамической перекомпиляции». Да, похоже, что это урежет большую часть корпуса коммутатора и значительно увеличит скорость. К сожалению, мой основной интерес заключается в эмуляции старых 8-битных и 16-битных консолей (здесь Intel 8080 является лишь примером, так как это мой самый простой фрагмент эмулируемого кода), где цикл и синхронизация в точном соответствии с инструкциями важны, так как видео и звук должны быть обработаны на основе этих точных временных интервалов.
При работе с таким уровнем точности производительность становится проблемой даже для старых консолей (например, посмотрите на bSnes). Есть ли какой-то выход или это просто прозаично при работе с процессорами с длинными конвейерами?