What about synchronous vs. asynchronous JIT?

By default JIT is asynchronous. It means that the CPU interprets Alpha code when there is no compiled version of it. At the same time the JIT compiler compiles the code in case it is needed next time. Synchronous JIT would compile first and then execute. There is no parallelism in it. Synchronous JIT is there merely for testing and debugging. There exist applications that constantly modify or generate code. Synchronous JIT is very inefficient with such applications, due to the compilation overhead for the code that is executed once. However, in some cases synchronous JIT is somewhat faster than asynchronous one, because it does not suffer from the synchronization overhead.