30.2. Ðогда пÑименÑÑÑ JIT?
JIT-компилÑÑÐ¸Ñ Ð¸Ð¼ÐµÐµÑ ÑмÑÑл в пеÑвÑÑ Ð¾ÑеÑÐµÐ´Ñ Ð´Ð»Ñ Ð´Ð»Ð¸ÑелÑнÑÑ Ð·Ð°Ð¿ÑоÑов, нагÑÑжаÑÑÐ¸Ñ Ð¿ÑоÑеÑÑоÑ. ÐапÑимеÑ, Ñакой Ñ Ð°ÑакÑÐµÑ Ð¾Ð±ÑÑно имеÑÑ Ð°Ð½Ð°Ð»Ð¸ÑиÑеÑкие запÑоÑÑ. ÐÐ»Ñ Ð±ÑÑÑÑÑÑ Ð·Ð°Ð¿ÑоÑов накладнÑе ÑаÑÑ Ð¾Ð´Ñ, ÑвÑзаннÑе Ñ Ð²Ñполнением JIT-компилÑÑии, ÑаÑÑо бÑдÑÑ Ð¿ÑевÑÑаÑÑ Ð²ÑигÑÑÑ Ð¾Ñ Ð¸Ñ ÑÑкоÑениÑ.
РеÑение об иÑполÑзовании JIT-компилÑÑии пÑинимаеÑÑÑ Ð½Ð° оÑновании обÑей ÑÑоимоÑÑи запÑоÑа (Ñм. ÐлавÑ 67 и ÐодÑаздел 18.7.2). СÑоимоÑÑÑ Ð·Ð°Ð¿ÑоÑа ÑÑавниваеÑÑÑ Ñо знаÑением jit_above_cost, и еÑли она оказÑваеÑÑÑ Ð±Ð¾Ð»ÑÑе, пÑоизводиÑÑÑ JIT-компилÑÑиÑ. ÐаÑем пÑинимаÑÑÑÑ ÐµÑÑ Ð´Ð²Ð° ÑеÑениÑ. Ðо-пеÑвÑÑ , еÑли его ÑÑоимоÑÑÑ Ð¿ÑевÑÑÐ°ÐµÑ Ð¸ знаÑение jit_inline_above_cost, Ñела неболÑÑÐ¸Ñ ÑÑнкÑий и опеÑаÑоÑов, ÑигÑÑиÑÑÑÑÐ¸Ñ Ð² запÑоÑе, бÑдÑÑ Ð²ÑÑÑаиваÑÑÑÑ Ð² вÑзÑваÑÑий код. Ðо-вÑоÑÑÑ , еÑли ÑÑоимоÑÑÑ Ð·Ð°Ð¿ÑоÑа пÑевÑÑÐ°ÐµÑ Ð·Ð½Ð°Ñение jit_optimize_above_cost, пÑи генеÑаÑии кода задейÑÑвÑÑÑÑÑ Ð´Ð¾ÑогоÑÑоÑÑие опÑимизаÑии Ð´Ð»Ñ ÑлÑÑÑÐµÐ½Ð¸Ñ ÑгенеÑиÑованного кода. Ðбе ÑÑи опеÑаÑии ÑвелиÑиваÑÑ Ð½Ð°ÐºÐ»Ð°Ð´Ð½Ñе ÑаÑÑ Ð¾Ð´Ñ JIT, но могÑÑ Ð·Ð½Ð°ÑиÑелÑно ÑокÑаÑиÑÑ Ð²ÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа.
ÐÑи ÑеÑÐµÐ½Ð¸Ñ Ð¿ÑинимаÑÑÑÑ Ð½Ð° оÑнове ÑÑоимоÑÑи во вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ, а не иÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑа. ÐÑо ознаÑаеÑ, ÑÑо в ÑлÑÑае иÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð³Ð¾ÑовленнÑÑ Ð¾Ð¿ÐµÑаÑоÑов и обÑего плана (Ñм. Раздел «ÐÑимеÑаниÑ») пÑинÑÑие ÑеÑений завиÑÐ¸Ñ Ð¾Ñ Ð¿Ð°ÑамеÑÑов конÑигÑÑаÑии, дейÑÑвÑÑÑÐ¸Ñ Ð²Ð¾ вÑÐµÐ¼Ñ Ð¿Ð¾Ð´Ð³Ð¾Ñовки запÑоÑа, а не во вÑÐµÐ¼Ñ Ð²ÑполнениÑ.
ÐÑимеÑание
ÐÑли паÑамеÑÑ jit Ð¸Ð¼ÐµÐµÑ Ð·Ð½Ð°Ñение off или ÑеÑÐ²ÐµÑ Ð½Ðµ поддеÑÐ¶Ð¸Ð²Ð°ÐµÑ JIT (напÑимеÑ, поÑÐ¾Ð¼Ñ ÑÑо он бÑл ÑкомпилиÑован без --with-llvm), JIT-компилÑÑÐ¸Ñ Ð²ÑполнÑÑÑÑÑ Ð½Ðµ бÑдеÑ, даже еÑли она бÑла Ð±Ñ Ð²Ñгодна, иÑÑ
Ð¾Ð´Ñ Ð¸Ð· опиÑаннÑÑ
вÑÑе кÑиÑеÑиев. ÐÑиÑвоенное паÑамеÑÑÑ jit знаÑение off ÑÑиÑÑваеÑÑÑ Ð¸ во вÑÐµÐ¼Ñ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ, и во вÑÐµÐ¼Ñ Ð²ÑÐ¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿ÑоÑов.
EXPLAIN позволÑÐµÑ Ð¾Ð¿ÑеделиÑÑ, иÑполÑзÑеÑÑÑ Ð»Ð¸ JIT-компилÑÑиÑ. ÐапÑимеÑ, Ñак вÑглÑÐ´Ð¸Ñ Ð·Ð°Ð¿ÑоÑ, не иÑполÑзÑÑÑий JIT:
=# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
QUERY PLAN
-------------------------------------------------------------------â------------------------------------------
Aggregate (cost=16.27..16.29 rows=1 width=8) (actual time=0.303..0.303 rows=1 loops=1)
-> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4) (actual time=0.017..0.111 rows=356 loops=1)
Planning Time: 0.116 ms
Execution Time: 0.365 ms
(4 rows)
УÑиÑÑÐ²Ð°Ñ ÑÑоимоÑÑÑ Ð¿Ð»Ð°Ð½Ð¸ÑованиÑ, оÑказ Ð¾Ñ Ð¸ÑполÑÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ JIT вполне обоÑнован, Ñак как ÑÑоимоÑÑÑ JIT-компилÑÑии оказалаÑÑ Ð±Ñ Ð±Ð¾Ð»ÑÑе, Ñем вÑигÑÑÑ Ð¾Ñ Ð¾Ð¿ÑимизаÑии. ÐÑли ÑменÑÑиÑÑ Ð¾Ð³ÑаниÑение ÑÑоимоÑÑи, JIT бÑÐ´ÐµÑ Ð¸ÑполÑзоваÑÑÑÑ:
=# SET jit_above_cost = 10;
SET
=# EXPLAIN ANALYZE SELECT SUM(relpages) FROM pg_class;
QUERY PLAN
-------------------------------------------------------------------â------------------------------------------
Aggregate (cost=16.27..16.29 rows=1 width=8) (actual time=6.049..6.049 rows=1 loops=1)
-> Seq Scan on pg_class (cost=0.00..15.42 rows=342 width=4) (actual time=0.019..0.052 rows=356 loops=1)
Planning Time: 0.133 ms
JIT:
Functions: 3
Options: Inlining false, Optimization false, Expressions true, Deforming true
Timing: Generation 1.259 ms, Inlining 0.000 ms, Optimization 0.797 ms, Emission 5.048 ms, Total 7.104 ms
Execution Time: 7.416 ms
Рданном ÑлÑÑае видно, ÑÑо JIT иÑполÑзÑеÑÑÑ, но вÑÑÑаивание (Inlining) и доÑогоÑÑоÑÑие опÑимизаÑии (Optimization) не вÑполнÑлиÑÑ. ЧÑÐ¾Ð±Ñ Ð¸Ñ Ð²ÐºÐ»ÑÑиÑÑ, нÑжно бÑло Ñакже ÑменÑÑиÑÑ jit_inline_above_cost и jit_optimize_above_cost.