Most dynamic emulators don't do instruction by instruction emulation - they take in a whole block of instructions and translate that block, caching chunks that may be used without any inference (eg. branching). Once you hit a similar instruction block you don't have to do any translation; just execute from the cache. This is why you have a load time for reading from an x86 image.