HHVM poor performance

HHVM engineer here.

In server mode, HHVM will run the first N requests it sees in interpreter-only mode (i.e. with the JIT off).

The default in an optimized build is N=11, so if you were to run the request 12 times, the 12th one would be much faster.

You can tune this with a config option, like so: -v Eval.JitWarmupRequests=3. If you set it to 0, you’ll see the speedup immediately.

There are a couple reasons to do this.

First, it prevents transient warmup effects from affecting JIT-compiled code.

For example, the first few requests may need populate values in APC, which will cause the application code to go down different paths from the steady-state paths. This way, we don’t waste space on JIT compilations that will only be used a few times.

Second, it allows HHVM to collect profiling information to improve future compilation.

If we observe that a certain value is an integer 99% of the time, for example, we can compile code that’s optimized for the integer case. We currently don’t have the facility to JIT-compile code with profiling enabled (the hard part is safely throwing it away once we’re done with it), so we do the data collection in interpreter-only mode.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)