Эмулятору приходится воспроизводить не только вычисления
Обычная программа обращается к процессору и другим устройствам так, как ожидает конкретная система. Эмулятору нужно создать для неё такую среду на другой машине. Он отслеживает состояние «виртуального» процессора — например, значения регистров и содержимое памяти — и воспроизводит реакции устройств, с которыми программа могла бы взаимодействовать.
Поэтому один шаг исходной программы иногда превращается в цепочку действий на принимающем компьютере: прочитать команду, определить её смысл, обновить состояние виртуальной машины и проверить, не затронуты ли память или подключённые устройства. Повторяются эти действия миллионы раз, и дополнительные проверки накапливаются в заметные затраты.
Точность требует следить за временем и мелочами
Недостаточно получить правильный итог вычисления. Программа может рассчитывать на определённый порядок операций, задержку устройства или особенности старого процессора. Если эмулятор не воспроизведёт такую деталь, игра может работать неправильно, а программа — зависнуть или неверно обработать ввод.
Приходится выбирать, что именно моделировать и насколько подробно. Чем точнее эмулятор воспроизводит поведение системы, тем больше работы он может выполнять за каждую команду. Это особенно ощутимо, когда исходная машина устроена совсем иначе, чем та, на которой запущена эмуляция.
Перевод можно ускорить, но не отменить
Некоторые эмуляторы заранее переводят части программы в команды процессора хост-машины — так называют компьютер, который запускает эмулятор. Это избавляет от повторного разбора одних и тех же команд. Однако эмулятору всё равно нужно поддерживать состояние исходной системы и согласовывать её поведение с доступными на хосте средствами.
Поэтому накладные расходы зависят от пары устройств и качества реализации: мощная машина может эмулировать старую быстро, но сама эмуляция всё равно решает более сложную задачу, чем простое выполнение родной для неё программы.






