В настоящее время я делаю некоторый тест для тестирования компилятора JIT, чтобы проверить, какой прирост производительности мы можем ожидать между запросом с отключенным JIT, одним запросом с включенным JIT и пользовательской реализацией непосредственно внутри кодовой базы clickhouse-server
.
В качестве базового теста я создаю таблицу с 10 различными столбцами одного типа, выполняя только простые арифметические операции.Эта таблица содержит 10 миллионов строк.
Формула может быть представлена как a / a' + b / b' + c / c' + d / d' + e / e'
.
. Хотя мы можем наблюдать значительное улучшение производительности с помощью пользовательской функции clickhouse, мы не можем видеть заметныхувеличение производительности при использовании JIT-компилятора, который, возможно, не будет создавать промежуточные столбцы для выполнения операций такого типа.
Файл, который я использую для clickhouse performance-test
<test>
<name>Without JIT VS JIT VS custom implementation</name>
<type>loop</type>
<stop_conditions>
<all_of>
<iterations>10</iterations>
</all_of>
</stop_conditions>
<create_query>CREATE TABLE test (a UInt64, a_ UInt64, b UInt64, b_ UInt64, c UInt64, c_ UInt64, d UInt64, d_ UInt64, e UInt64, e_ UInt64) Engine = Memory</create_query>
<fill_query>INSERT INTO test SELECT number, number, number, number, number, number, number, number, number, number from system.numbers LIMIT 10000000</fill_query>
<query>
SELECT
a / a_ + b / b_ + c / c_ + d / d_ + e / e_
FROM
test
SETTINGS
compile_expressions = 0;
</query>
<query>
SELECT
a / a_ + b / b_ + c / c_ + d / d_ + e / e_
FROM
test
SETTINGS
compile_expressions = 1;
</query>
<query>
SELECT custom_implementation(a, a_, b, b_, c, c_, d, d_, e, e_) FROM test
</query>
<drop_query>DROP TABLE IF EXISTS test</drop_query>
</test>
output
{
...
"runs": [
{
"bytes_per_second": 3477655258.582295,
"min_time": 0.224000,
"quantiles": {
"0.1": 0.224292,
"0.2": 0.224770,
"0.3": 0.225735,
"0.4": 0.227052,
"0.5": 0.228536,
"0.6": 0.229970,
"0.7": 0.232717,
"0.8": 0.237127,
"0.9": 0.237441,
"0.95": 0.238033,
"0.99": 0.238508,
"0.999": 0.238614,
"0.9999": 0.238625
},
"queries_per_second": 4.347069,
"query": "\n SELECT\n a / a_ + b / b_ + c / c_ + d / d_ + e / e_\n FROM\n test\n SETTINGS\n compile_expressions = 0;\n ",
"query_index": 0,
"rows_per_second": 43470690.732279,
"total_time": 2.300401
},
{
"bytes_per_second": 3507592718.689820,
"min_time": 0.224000,
"quantiles": {
"0.1": 0.224705,
"0.2": 0.225049,
"0.3": 0.225372,
"0.4": 0.225570,
"0.5": 0.225661,
"0.6": 0.225992,
"0.7": 0.226896,
"0.8": 0.229604,
"0.9": 0.236507,
"0.95": 0.237723,
"0.99": 0.238695,
"0.999": 0.238913,
"0.9999": 0.238935
},
"queries_per_second": 4.384491,
"query": "\n SELECT\n a / a_ + b / b_ + c / c_ + d / d_ + e / e_\n FROM\n test\n SETTINGS\n compile_expressions = 1;\n ",
"query_index": 1,
"rows_per_second": 43844908.983623,
"total_time": 2.280767
},
{
"bytes_per_second": 6126143858.553072,
"min_time": 0.117000,
"quantiles": {
"0.1": 0.124773,
"0.2": 0.125735,
"0.3": 0.126914,
"0.4": 0.127659,
"0.5": 0.129169,
"0.6": 0.131099,
"0.7": 0.132744,
"0.8": 0.136030,
"0.9": 0.142146,
"0.95": 0.142186,
"0.99": 0.142218,
"0.999": 0.142225,
"0.9999": 0.142226
},
"queries_per_second": 7.657680,
"query": "\n SELECT custom_implementation(a, a_, b, b_, c, c_, d, d_, e, e_) FROM test\n ",
"query_index": 2,
"rows_per_second": 76576798.231913,
"total_time": 1.305879
}
],
...
}
Компилятор JIT компилирует выражение только в некоторых частных случаях?