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