2017-07-17 15:36:27 +00:00
<test >
2017-07-17 18:01:47 +00:00
2017-07-17 15:36:27 +00:00
<stop_conditions >
<any_of >
2019-05-21 10:03:36 +00:00
<total_time_ms > 12000</total_time_ms>
2017-07-17 15:36:27 +00:00
</any_of>
</stop_conditions>
2017-07-17 18:01:47 +00:00
2020-03-11 21:07:34 +00:00
<settings >
<max_memory_usage > 30000000000</max_memory_usage>
</settings>
2017-07-17 15:36:27 +00:00
2017-07-17 18:01:47 +00:00
<!-- 9. Генератор случайных чисел.
2017-07-17 15:36:27 +00:00
Функция rand представляет собой linear congruential generator (то есть, целочисленное умножение на константу и сложение с константой), возвращающий 32-битные целые случайные числа.
Она реализована так, чтобы несколько потоков случайных чисел вычислялось независимо, и компилятор мог векторизовать цикл.
Тест, как и многие другие ниже, представлен в виде запроса из таблицы system.numbers. Чтение из этой таблицы осуществляется в один поток, и эта таблица при чтении выдаёт подряд почти все натуральные числа.
Т о есть, этот запрос представляет собой необычным образом написанный бесконечный цикл.
Мы запускаем этот запрос и наблюдаем, с какой скоростью он выполняется. Через несколько секунд, когда скорость стабилизируется, прерываем выполнение.
В качестве скорости выполнения запроса указывается количество обработанных исходных (прочитанных из таблицы) данных в единицу времени.
2020-03-07 19:32:36 +00:00
Например, в таблице numbers читаемые нами данные - это числа типа UInt64 (8 байт). Если мы обрабатываем миллиард таких чисел в секунду, то отобразится скорость - 8 GB/sec. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM zeros( 100000000) WHERE NOT ignore(rand())</query>
<query > SELECT count() FROM zeros_mt(1600000000) WHERE NOT ignore(rand())</query>
2017-07-17 15:36:27 +00:00
<!-- 10. Некриптографическая хэш - функция для целых чисел 64bit - > 64bit. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM numbers( 100000000) WHERE NOT ignore(intHash64(number))</query>
<query > SELECT count() FROM numbers_mt(1600000000) WHERE NOT ignore(intHash64(number))</query>
2017-07-17 15:36:27 +00:00
<!-- 11. Некриптографическая хэш - функция для целых чисел 64bit - > 32bit. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM numbers( 100000000) WHERE NOT ignore(intHash32(number))</query>
<query > SELECT count() FROM numbers_mt(1600000000) WHERE NOT ignore(intHash32(number))</query>
2017-07-17 15:36:27 +00:00
<!-- 12. Преобразование целого числа в строку в десятичном виде. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM numbers( 10000000) WHERE NOT ignore(toString(number))</query>
<query > SELECT count() FROM numbers_mt(160000000) WHERE NOT ignore(toString(number))</query>
2017-07-17 15:36:27 +00:00
<!-- 13. Преобразование целого числа в строку путём копирования куска памяти. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM numbers( 100000000) WHERE NOT ignore(reinterpretAsString(number))</query>
<query > SELECT count() FROM numbers_mt(1600000000) WHERE NOT ignore(reinterpretAsString(number))</query>
2017-07-17 15:36:27 +00:00
<!-- 26. Целочисленное деление на константу. Используется библиотека libdivide. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM numbers( 100000000) WHERE NOT ignore(number / 7)</query>
<query > SELECT count() FROM numbers_mt(1600000000) WHERE NOT ignore(number / 7)</query>
2017-07-17 15:36:27 +00:00
<!-- 27. Целочисленное деление на константу. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM numbers( 100000000) WHERE NOT ignore(number % 7)</query>
<query > SELECT count() FROM numbers_mt(1600000000) WHERE NOT ignore(number % 7)</query>
2017-07-17 15:36:27 +00:00
<!-- 28. Целочисленное деление на константу. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM numbers( 100000000) WHERE NOT ignore(number % 34908756)</query>
<query > SELECT count() FROM numbers_mt(1600000000) WHERE NOT ignore(number % 34908756)</query>
2017-07-17 15:36:27 +00:00
<!-- 29. Lookup - таблица, помещающаяся в L2 - кэш. -->
2020-03-17 14:36:24 +00:00
<query > SELECT number % 1000 AS k, count() FROM numbers( 100000000) GROUP BY k FORMAT Null</query>
<query > SELECT number % 1000 AS k, count() FROM numbers_mt(1600000000) GROUP BY k FORMAT Null</query>
2017-07-17 15:36:27 +00:00
<!-- 30. Хэш - таблица, помещающаяся в L3 - кэш. -->
2020-03-17 02:56:44 +00:00
<query > SELECT number % 100000 AS k, count() FROM numbers( 10000000) GROUP BY k FORMAT Null</query>
<query > SELECT number % 100000 AS k, count() FROM numbers_mt(160000000) GROUP BY k FORMAT Null</query>
2017-07-17 15:36:27 +00:00
<!-- 31. Хэш - таблица, наверное помещающаяся в L3 - кэш. -->
2020-03-17 02:56:44 +00:00
<query > SELECT number % 1000000 AS k, count() FROM numbers( 10000000) GROUP BY k FORMAT Null</query>
<query > SELECT number % 1000000 AS k, count() FROM numbers_mt(160000000) GROUP BY k FORMAT Null</query>
2017-07-17 15:36:27 +00:00
<!-- 32. Хэш - таблица, не помещающаяся в L3 - кэш. -->
2020-03-17 14:36:24 +00:00
<query > SELECT number % 10000000 AS k, count() FROM numbers( 10000000) GROUP BY k FORMAT Null</query>
<query > SELECT number % 10000000 AS k, count() FROM numbers_mt(80000000) GROUP BY k FORMAT Null</query>
2017-07-17 15:36:27 +00:00
<!-- 33. Хэш - таблица, требующая кучу оперативки. Возможны интересные эффекты. -->
2020-03-18 00:15:05 +00:00
<!-- For this HT size, a single - threaded query that makes sense would be too slow (tens of seconds).
<query > SELECT number % 100000000 AS k, count() FROM numbers( 100000000) GROUP BY k FORMAT Null</query>
-->
2020-03-18 15:22:29 +00:00
<query > SELECT number % toUInt32(1e8) AS k, count() FROM numbers_mt(toUInt32(1e8)) GROUP BY k FORMAT Null</query>
2017-07-17 15:36:27 +00:00
<!-- 35. Кэш - промахи, осуществляемые из многих процессорных ядер. -->
2020-03-07 19:32:36 +00:00
<!-- <query>SELECT number % (intDiv(100000000, {THREADS})) AS k, count() FROM numbers_mt(1600000000) GROUP BY k</query> -->
2017-07-17 15:36:27 +00:00
<!-- 46. Запрос, требующий много бесполезных копирований. -->
2020-03-17 14:36:24 +00:00
<query > SELECT count() FROM zeros(1000000) WHERE NOT ignore(materialize('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') AS s, concat(s,s,s,s,s,s,s,s,s,s) AS t, concat(t,t,t,t,t,t,t,t,t,t) AS u) SETTINGS max_block_size = 1000</query>
2017-07-17 15:36:27 +00:00
</test>