Windows의 x86 에뮬레이터는 단순히 명령어를 하나씩 흉내 내지 않는다. 핵심은 바이너리 번역(JIT)이다. x86 코드 블록을 ARM 네이티브 코드로 한 번 변환해 캐시에 저장하고, 같은 블록이 반복 실행될 때마다 재사용한다. 변환은 한 번, 실행은 수없이 반복되므로 변환 시점에 들인 최적화 비용이 충분히 상쇄된다. 바로 이 지점에서 흥미로운 일이 벌어진다. 원본 프로그램이 비효율적인 패턴(불필요한 반복, 낭비되는 연산, 죽은 코드 등)을 담고 있을 때, 에뮬레이터의 번역기가 그 패턴을 인식하고 더 나은 코드로 바꿔 내보내는 것이다. 결과적으로 에뮬레이션이 원본을 그대로 실행하는 것보다 빨라지는, 직관에 반하는 상황이 생긴다. 개발자에게 주는 교훈은 분명하다. 내 코드 아래에는 OS, 런타임, JIT, 에뮬레이터라는 여러 정교한 계층이 있고, 이들은 종종 우리가 짠 코드를 다시 쓴다. 성능을 논할 때 '어떤 명령어를 쓰느냐'보다 '그 아래 계층이 그것을 어떻게 다시 해석하느냐'를 이해하는 것이 점점 더 중요해지고 있다.