Нет увеличения производительности при использовании JIT-компилятора - PullRequest
1 голос
/ 10 мая 2019

В настоящее время я делаю некоторый тест для тестирования компилятора 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 компилирует выражение только в некоторых частных случаях?

...